Linux C 线程

线程

  • 概述
    • 线程和进程的异同
    • 如何选择使用进程还是线程
  • 函数
    • 获取进程自身ID  pthread_self
    • 创建线程  pthread_create
    • 退出线程  pthread_exit
    • 线程等待  pthread_join
  • 四种线程模型
    • 1 )单线程
    • 2 )单线程
    • 3 )双线程
    • 4 )三线程

概述

  线程(英语:thread)是操作系统能够进行运算调度的最小单位(程序执行流的最小单元)。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。在Unix System V及SunOS中也被称为轻量进程(lightweight processes),但轻量进程更多指内核线程(kernel thread),而把用户线程(user thread)称为线程。
在这里插入图片描述

线程和进程的异同

包含关系:
  每个进程至少有一个线程,这些线程共享进程的所有资源,线程本身只拥有自己的栈空间。
控制块:
  线程是TCB,进程是PCB。
基本单位:
  进程——资源分配的最小单位,线程——程序执行的最小单位。(面试)
状态:
  进程和线程一样都拥有阻塞态、就绪态、运行态。
在Linux中的编译指令:
  进程使用 gcc xxx.c -o xxx
  线程使用 gcc xxx.c -lpthread -o xxx

如何选择使用进程还是线程

①需要频繁创建销毁的优先使用线程,因为对进程来说创建和销毁一个进程代价是很大的。
②切换频繁和耗时操作用线程,因为程的切换速度快,应用程序的响应快。
③多机分布的用进程,多核分布用线程,因为对 CPU 系统的效率使用上线程更占优。
④并行操作时使用线程,如 C/S 架构的服务器端并发线程响应用户的请求。
⑤需要更稳定安全时,适合选择进程;需要速度时,选择线程更好。

函数

获取进程自身ID  pthread_self

头文件:
  #include <pthread.h>
函数原型:pthread_t pthread_self(void);
返回值:进程自身的 ID。

	pthread_t pid = pthread_self();

创建线程  pthread_create

头文件:
  #include <pthread.h>
函数原型:int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg);
参数介绍:
  thread: 子线程ID。
  attr:分离属性与非分离属性。
在这里插入图片描述
  void *(*start_routine) (void *):线程服务函数。
  arg:线程函数的参数
返回值:成功返回 0 失败返回 error。

分离与非分离属性:
分离:分离一个正在运行的线程并不影响进程,仅仅是通知当前系统该线程结束时,其所属的资源可以回收;分离的线程在终止时会保留它的虚拟内存,包括他们的堆栈和其他系统资源,有时这种线程被称为“僵尸线程”。
非分离:如果线程具有非分离属性,进程终止时会被立刻回收将释放掉所有线程。终止时未释放的系统资源和进程资源,不保存线程返回值的内存空间、堆栈、寄存器等。

void * pthread_fun(void * arg)
{}pthread_t pid;pthread_create(&pid,NULL,pthread_fun,NULL);

退出线程  pthread_exit

头文件:
  #include <pthread.h>
函数原型:void pthread_exit(void *retval);
参数介绍:
  retval:返回值地址。

void * pthread_fun(void * arg)
{pthread_exit(NULL);
}

线程等待  pthread_join

头文件:
  #include <pthread.h>
函数原型:int pthread_join(pthread_t thread, void **retval);
参数介绍:
  thread:等待线程的 ID
  Retval:返回值。
返回值:成功返回 0,失败返回 error。

	pthread_join( pid , NULL );

四种线程模型

注:下面图中的pc为pthread_create简写。

1 )单线程

执行顺序:
main → fun1 → fun2 → fun3 → mainend
此模型中只有一个线程,所有的函数线程id相同。
在这里插入图片描述

2 )单线程

执行顺序:
main → fun1 → fun2 → fun1end → fun3 → mainend
此模型中只有一个线程,所有的函数线程id相同。
在这里插入图片描述

3 )双线程

执行顺序:
main → fun2 → fun3 → mainend
 ↓pc(fun1)
fun1 → fun1end
此模型中有俩个线程。
在这里插入图片描述

4 )三线程

执行顺序
main → fun3 → mainend
 ↓pc(fun1)
fun1 → fun1end
 ↓pc(fun2)
fun2 → fun2end
此模型中有三个线程。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/197181.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

记录我常用的免费API接口

目录 1.随机中英文句子 2.随机中英文句子&#xff08;带图片和音频&#xff09; 3.随机一句诗 4.随机一句话 5.随机一句情话 6. 随机一句舔狗语录 7.历史上的今天 8.获取来访者ip地址 9&#xff1a;获取手机号信息 10. 垃圾分类查询 11.字典查询 12.QQ信息查询 1.随…

Alibaba Nacos注册中心源码剖析

Nacos&Ribbon&Feign核心微服务架构图 架构原理&#xff1a; 微服务系统在启动时将自己注册到服务注册中心&#xff0c;同时对外发布 Http 接口供其它系统调用&#xff08;一般都是基于Spring MVC&#xff09;服务消费者基于 Feign 调用服务提供者对外发布的接口&…

使用VC++实现分段线性变换,直方图均衡化、锐化处理(使用拉普拉斯算子)

图像锐化1 获取源工程可访问huiningLi的gitee可在此工程的基础上进行学习。 实验要求 5.1实验目的、要求 实验目的&#xff1a; &#xff08;1&#xff09;掌握图像增强的原理与相关方法。 &#xff08;2&#xff09;能使用VC实现图像增强的一些相关功能。 实验要求&#xf…

C/C++字符判断 2021年12月电子学会青少年软件编程(C/C++)等级考试一级真题答案解析

目录 C/C字符判断 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 C/C字符判断 2021年12月 C/C编程等级考试一级编程题 一、题目要求 1、编程实现 对于给定的字符&#xff0c;如果该字符是大小写字母或…

Uniapp连接iBeacon设备——实现无线定位与互动体验(实现篇)

export default { data() { return { iBeaconDevices: [], // 存储搜索到的iBeacon设备 deviceId: [], data: [], url: getApp().globalData.url, innerAudioContext: n…

定时获取公网ip并发送邮件提醒

前一段时间路由器刷的老毛子固件“穿透服务”中定时更新阿里DDNS失败了&#xff0c;用了很久第一次遇到。所以需要做个备用的措施用来实时获取公网ip信息 1、基于python实现 开启邮箱的SMTP功能拿到授权码(不是登录密码) #!/usr/bin/python # -*- coding: UTF-8 -*- import …

vue解除数据双向绑定

let obj JSON.parse(JSON.stringify(data));例如&#xff0c;table列表中&#xff0c;点击编辑时&#xff0c;可对val进行如上操作来解除双向绑定

Java Swing算术我最棒

内容要求 1) 本次程序设计是专门针对 Java 课程的,要求使用 Java 语言进行具有一定代码量的程序开发。程序的设计要结合一定的算法&#xff0c;在进行代码编写前要能够设计好自己的算法。 本次程序设计涉及到 Java 的基本语法&#xff0c;即课堂上所介绍的变量、条件语句、循…

什么是缓存雪崩、击穿、穿透?

背景 数据一般是存储于数据库中&#xff0c;数据库中的数据都是存在磁盘上的&#xff0c;磁盘读写的速度相较于内存或者CPU中的寄存器来说是非常慢的了。 如果用户的请求都直接访问数据库的话&#xff0c;请求数量一上来&#xff0c;数据库很容易就崩溃了&#xff0c;所以为了…

Flume学习笔记(2)—— Flume进阶

Flume进阶 Flume 事务 事务处理流程如下&#xff1a; Put doPut&#xff1a;将批数据先写入临时缓冲区putListdoCommit&#xff1a;检查channel内存队列是否足够合并。doRollback&#xff1a;channel内存队列空间不足&#xff0c;回滚数据 Take doTake&#xff1a;将数据取…

应用场景丨迭代市政综合管廊监测系统建设

市政综合管廊是指在城市地下建造的隧道空间&#xff0c;将市政、电力、通讯、燃气、给排水等各种管线集于一体&#xff0c;实施统一规划、设计、建设和管理。综合管廊有利于解决反复开挖路面、架空线网密集、管线事故频发等问题&#xff0c;是保障城市运行的重要基础设施和“生…

Dubbo的优雅下线原理分析

文/朱季谦 Dubbo如何实现优雅下线&#xff1f; 这个问题困扰了我一阵&#xff0c;既然有优雅下线这种说法&#xff0c;那么&#xff0c;是否有非优雅下线的说法呢&#xff1f; 这&#xff0c;还真有。 可以从linux进程关闭说起&#xff0c;其实&#xff0c;我们经常使用到杀…

策略模式在数据接收和发送场景的应用(升级版)

1.背景 在数据接收和发送场景打算使用了 if else 进行判断&#xff1a; if("A".equals(system)){ASystem.sync("向A同步数据"); } if("B".equals(system)){BSystem.sync("向B同步数据"); } ... 非常麻烦&#xff0c;需求多了很臃肿&…

C++标准模板(STL)- 类型支持 (类型关系,检查两个类型是否相同,std::is_same)

类型特性 类型特性 类型特性定义一个编译时基于模板的结构&#xff0c;以查询或修改类型的属性。 试图特化定义于 <type_traits> 头文件的模板导致未定义行为&#xff0c;除了 std::common_type 可依照其所描述特化。 定义于<type_traits>头文件的模板可以用不完…

macos 配置ndk环境

选择Android Studio下默认的ndk环境 mac电脑的ndk默认路径一般是 /Users/user_name/Library/Android/sdk/ndk/version_code 其中user_name为自己电脑的用户名&#xff0c;version_code为自己ndk安装的版本号&#xff0c;比如我这里电脑的ndk路径就是 /Users/zhangsan/Libra…

多线程Thread(初阶一:认识线程)

目录 一、引用线程的原因 二、线程的概念 三、进程和线程的区别 四、多线程编程 一、引用线程的原因 多任务操作系统&#xff0c;希望系统能同时运行多个任务。所以会涉及到进程&#xff0c;需要对进程进行管理、调度等。 而单任务操作系统&#xff0c;就完全不涉及到进程…

【漏洞复现】浙大恩特CRM文件上传0day

漏洞描述 浙大恩特客户资源管理系统任意文件上传漏洞 免责声明 技术文章仅供参考,任何个人和组织使用网络应当遵守宪法法律,遵守公共秩序,尊重社会公德,不得利用网络从事危害国家安全、荣誉和利益,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用…

demo(三)eurekaribbonhystrix----服务降级熔断

一、介绍&#xff1a; 1、雪崩&#xff1a; 多个微服务之间调用的时候&#xff0c;假如微服务A调用微服务B和微服务C&#xff0c;微服务B和微服务C又调用其他的微服务&#xff0c;这就是所谓的"扇出"。如果扇出的链路上某个微服务的调用响应的时间过长或者不可用&am…

S7-1200PLC 作为MODBUSTCP服务器通信(多客户端访问)

S7-1200PLC作为MODBUSTCP服务器端通信编程应用,详细内容请查看下面文章链接: ModbusTcp通信(S7-1200PLC作为服务器端)-CSDN博客文章浏览阅读239次。S7-200Smart plc作为ModbusTcp服务器端的通信S7-200SMART PLC ModbusTCP通信(ModbusTcp服务器)_s7-200 modbustcp-CSDN博客文…

flutter开发web应用支持浏览器跨域设置

开发web应用难免会遇到跨域问题&#xff0c;所以flutter设置允许web跨域的设置是要在你的flutter安装路径下面 flutter\bin\cache 找到flutter_tools.stamp文件&#xff0c;然后删除掉&#xff1a;这个文件是临时缓存文件 然后找到 flutter\packages\flutter_tools\lib\src\web…