Linux C 线程

news2025/1/11 20:00:57

线程

  • 概述
    • 线程和进程的异同
    • 如何选择使用进程还是线程
  • 函数
    • 获取进程自身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.coloradmin.cn/o/1220702.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

选择Amazon EC2,走进云端新时代

目录 前言 选择云服务器 / 海外服务器需要关注的重点 Amazon EC2 云服务器的优势所在 文末总结 前言 常言道&#xff0c;工欲善其事必先利其器&#xff0c;无论你是资深开发者&#xff0c;还是普通爱好者&#xff0c;在日常开发和学习生活中都需要用到云服务器提供的丰富的…

自建es数据迁移阿里云方案

一、ElasticSearch数据迁移方法介绍 https://help.aliyun.com/document_detail/170095.html?spma2c4g.26937906.0.0.429240c9ymiXGm 可以通过Logstash、reindex和OSS等多种方式完成阿里云Elasticsearch间数据迁移、Elasticsearch数据迁移至Openstore存储中、自建Elasticsear…

GB28181学习(十六)——基于jrtplib实现tcp被动和主动收流

前言 GB/T28181-2022实时流的传输方式介绍&#xff1a;https://blog.csdn.net/www_dong/article/details/134255185 tcp passive收流 流程图 注意&#xff1a; m字段指定传输方式为TCP/RTP/AVP&#xff1b;sdp信息中增加"asetup:passive"&#xff1b;SIP服务器启…

微服务学习 | Ribbon负载均衡、Nacos注册中心、微服务技术对比

Ribbon负载均衡 负载均衡流程 负载均衡策略 通过定义IRule实现可以修改负载均衡规则&#xff0c;有两种方式&#xff1a; 1. 代码方式:在服务消费者order-service中的OrderApplication类中&#xff0c;定义一个新的IRule: 2.配置文件方式: 在order-service的application.yml…

技术分享 | 如何写好测试用例?

对于软件测试工程师来说&#xff0c;设计测试用例和提交缺陷报告是最基本的职业技能。是非常重要的部分。一个好的测试用例能够指示测试人员如何对软件进行测试。在这篇文章中&#xff0c;我们将介绍测试用例设计常用的几种方法&#xff0c;以及如何编写高效的测试用例。 ## 一…

【Rust】快速教程——模块mod与跨文件

前言 道尊&#xff1a;没有办法&#xff0c;你的法力已经消失&#xff0c;我的法力所剩无几&#xff0c;除非咱们重新修行&#xff0c;在这个世界里取得更多法力之后&#xff0c;或许有办法下降。——《拔魔》 \;\\\;\\\; 目录 前言跨文件mod多文件mod 跨文件mod //my_mod.rs…

C#语言的由来与发展历程

C#语言的由来与发展历程可以追溯到2000年&#xff0c;当时微软公司为了在.NET平台上开发应用程序&#xff0c;发布了一种新的编程语言——C#。C#语言的设计目标是成为一种简单、现代、通用和面向对象的编程语言&#xff0c;为开发者提供更强大的生产力、更强大的面向对象支持和…

Line多账号如何运营?

Line在亚洲地区非常流行&#xff0c;特别是在日本、台湾、泰国等地&#xff0c;是当地最受欢迎的即时通讯应用之一。 除了基本的聊天功能外&#xff0c;Line还提供了各种各样的贴图、表情包和游戏等娱乐功能&#xff0c;吸引了大量的用户。 一、选择利用line进行海外营销的原…

2024年山东省职业院校技能大赛中职组“网络安全”赛项竞赛试题-A

2024年山东省职业院校技能大赛中职组 “网络安全”赛项竞赛试题-A 一、竞赛时间 总计&#xff1a;360分钟 二、竞赛阶段 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 A、B模块 A-1 登录安全加固 180分钟 200分 A-2 本地安全策略设置 A-3 流量完整性保护 A-4 …

百度智能云正式上线Python SDK版本并全面开源

文章目录 前言一、SDK的优势二、千帆SDK&#xff1a;快速落地LLM应用三、如何快速上手千帆SDK3.1、SDK快速启动3.2. SDK进阶指引 3.3. 通过Langchain接入千帆SDK4、开源社区 前言 百度智能云千帆大模型平台再次升级&#xff01;在原有API基础上&#xff0c;百度智能云正式上线…

【漏洞复现】IP-guard WebServer 远程命令执行

漏洞描述 IP-guard是一款终端安全管理软件,旨在帮助企业保护终端设备安全、数据安全、管理网络使用和简化IT系统管理。互联网上披露IP-guard WebServer远程命令执行漏洞情报。攻击者可利用该漏洞执行任意命令,获取服务器控制权限。 免责声明 技术文章仅供参考,任何个人和…

Beego之Bee工具使用

1、bee工具使用 bee 工具是一个为了协助快速开发 Beego 项目而创建的项目&#xff0c;通过 bee 你可以很容易的进行 Beego 项目的创 建、热编译、开发、测试、和部署。Bee工具可以使用的命令&#xff1a; [rootzsx ~]# bee 2023/02/18 18:17:26.196 [D] init global config…

Nacos在Windows本地安装并启动教程

Nacos在Windows本地安装并启动教程 Nacos注册中心和Eureka是两种常见的服务注册与发现组件&#xff0c;它们在以下方面存在一些区别&#xff1a; 开源项目&#xff1a;Nacos是阿里巴巴开源的项目&#xff0c;而Eureka是Netflix开源的项目。 功能特性&#xff1a;Nacos在服务注册…

SQL 查询优化指南:SELECT、SELECT DISTINCT、WHERE 和 ORDER BY 详解

SELECT 关键字 SQL的SELECT语句用于从数据库中选择数据。SELECT语句的基本语法如下&#xff1a; SELECT column1, column2, ... FROM table_name;其中&#xff0c;column1, column2,等是您要从表中选择的字段名称&#xff0c;而table_name是您要选择数据的表的名称。 如果要…

某60区块链安全之51%攻击实战学习记录

区块链安全 文章目录 区块链安全51%攻击实战实验目的实验环境实验工具实验原理攻击过程 51%攻击实战 实验目的 1.理解并掌握区块链基本概念及区块链原理 2.理解区块链分又问题 3.理解掌握区块链51%算力攻击原理与利用 4.找到题目漏洞进行分析并形成利用 实验环境 1.Ubuntu1…

Linux输入设备应用编程(键盘,按键)

目录 一 输入设备编程介绍 1.1 什么是输入设备呢&#xff1f; 1.2 什么是输入设备的应用编程&#xff1f; 1.3 input子系统 1.4 数据读取流程 1.5 应用程序如何解析数据 1.5.1 按键类事件&#xff1a; 1.5.2 相对位移事件 1.5.3 绝对位移事件 二 读取 struct input_e…

审视现状,持续优化,数字化转型不简单

北京市首都公路发展集团有限公司&#xff08;简称“首发集团”&#xff09;为北京市国有独资公司&#xff0c;1999年9月成立&#xff0c;负责北京市高速公路、城市道路及配套设施的投融资、建设及运营管理。集团下属4家分公司、10家全资或控股二级子公司&#xff0c;参股中铁京…

C++——map和set

作者&#xff1a;几冬雪来 时间&#xff1a;2023年11月17日 内容&#xff1a;C板块map和set知识讲解 目录 前言&#xff1a; map与set与关联式容器&#xff1a; set底层&#xff1a; set的书写&#xff1a; insert&#xff1a; erase&#xff1a; lower_bound与upper_b…

一文带你了解docker技术

什么是Docker Docker是一种虚拟技术&#xff0c;诞生于2013年&#xff0c;是dotCloud公司研发的开源项目&#xff0c;因为docker这个公司后来改名docker inc&#xff0c;docker的目标是实现轻量级的操作系统虚拟化解决方案。通俗点说&#xff0c;我们想在一台机器上运行多个系…

opencv(3):控制鼠标,创建 tackbar控件

文章目录 控制鼠标相关APIsetMouseCallbackcallback TrackBar 控件cv2.createTrackbarcv2.getTrackbarPos&#xff1a; 控制鼠标相关API setMouseCallback(winname, callback, userdata)callback(event, x, y, flags, userdata) setMouseCallback 在 OpenCV 中&#xff0c;s…