Linux线程——常用API

线程创建

函数原型及头文件

#include <pthread.h>
int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void *(*start_rtn)(void *), void *restrict arg);

参数解读

                tidp当pthread_create成功返回时,由tidp指向的内存单元被设置为新创建线程的线程ID。(指针,输入方式是地址)
                attr一般设为NULL。attr参数用于定制各种不同的线程属性,暂可以把它设置为NULL,以创建默认属性的线程。
(*start_rtn)(void *)新创建的线程的入口地址。新创建的线程从start_rtn函数的地址开始运行,该函数只有一个无类型指针参数arg。
                arg向start_rtn函数传递的参数。如果需要向start_rtn函数传递的参数不止一个,那么需要把这些参数放到一个结构中,然后把这个结构的地址作为arg参数传入。(指针,输入方式是地址,同时要注意是void *型)

返回值

若成功返回0,否则返回错误编号。

线程退出

单个线程可以通过以下三种方式退出,在不终止整个进程的情况下停止它的控制流:

1)线程只是从启动例程中返回,返回值是线程的退出码

2)线程可以被同一进程中的其他线程取消。

3)线程调用pthread_exit

函数原型及头文件

#include <pthread.h>
int pthread_exit(void *rval_ptr);

参数解读

rval_ptr:一个无类型指针,与传给启动例程的单个参数类似。进程中的其他线程可以通过调用pthread_join函数访问到这个指针。

线程等待

调用这个函数的线程将一直阻塞,直到指定的线程调用pthread_exit、从启动例程中返回或者被取消。如果例程只是从它的启动例程返回i,rval_ptr将包含返回码。如果线程被取消,由rval_ptr指定的内存单元就置为PTHREAD_CANCELED。

可以通过调用pthread_join自动把线程置于分离状态,这样资源就可以恢复。如果线程已经处于分离状态,pthread_join调用就会失败,返回EINVAL。

函数原型及头文件

#include <pthread.h>
int pthread_join(pthread_t thread, void **rval_ptr);

参数解读

thread线程名
**rval_ptr线程的返回值。如果对线程的返回值不感兴趣,可以把rval_ptr置为NULL。在这种情况下,调用pthread_join函数将等待指定的线程终止,但并不获得线程的终止状态。

返回值

若成功返回0,否则返回错误编号。

线程脱离

函数原型及头文件

#include <pthread.h>
int pthread_detach(pthread_t thread);

参数解读

一个线程或者是可汇合(joinable,默认值),或者是脱离的(detached)。当一个可汇合的线程终止时,它的线程ID和退出状态将留存到另一个线程对它调用pthread_join。脱离的线程却像守护进程,当它们终止时,所有相关的资源都被释放,我们不能等待它们终止。如果一个线程需要知道另一线程什么时候终止,那就最好保持第二个线程的可汇合状态。

pthread_detach函数把指定的线程转变为脱离状态。

返回值

若成功返回0,否则返回错误编号。

其他

本函数通常由想让自己脱离的线程使用,就如以下语句:

pthread_detach(pthread_self());

线程ID获取

函数原型及头文件

#include <pthread.h>
pthread_t pthread_self(void);

返回值

调用线程的ID。

线程比较

对于线程ID比较,为了可移植操作,我们不能简单地把线程ID当作整数来处理,因为不同系统对线程ID的定义可能不一样。

函数原型及头文件

#include <pthread.h>
int pthread_equal(pthread_t tid1, pthread_t tid2);

参数解读

tid1线程1的名字
tid2线程1的名字

返回值

若相等则返回非0值,否则返回0。

代码示例

线程返回数字打印

#include <stdio.h>
#include <pthread.h>void *func1(void *arg)
{static int ret = 1;//static保留数据 不然函数调用后空间无效printf("t1:this thread t1:%ld \n",(unsigned long)pthread_self());//self是void型 需对其进行强转printf("t1:num=%d\n",*((int *)arg));//传参过来的是主函数的num num取地址传过来需先将void型转成int型 再通过指针指向其地址得到数据pthread_exit((void *)&ret);//线程的退出 可附带线程的返回值 可通过pthread_join调用得到该数据
}
int main()
{int ret;int num =999;int *pret;pthread_t t1;ret = pthread_create(&t1,NULL,func1,(void *)&num);//第四个参数是void *型 而num是int型 需要对其进行强转 同时其输出为指针 则需要加上地址符号if(ret == 0)//判断线程是否创建成功{printf("main:create thread success\n");}printf("main:%ld\n",(unsigned long)pthread_self());	pthread_join(t1,(void **)&pret);//线程等待 等待上面函数退出之后再执行下面语句printf("main:ti quit %d\n",*pret);//打印出线程的返回值return 0;
}

线程返回字符串打印

#include <stdio.h>
#include <pthread.h>void *func1(void *arg)
{static char *p = "hello word";printf("t1:this thread t1:%ld \n",(unsigned long)pthread_self());printf("t1:num=%d\n",*((int *)arg));pthread_exit((void *)p);
}
int main()
{int ret;int num =999;char *pret;pthread_t t1;ret = pthread_create(&t1,NULL,func1,(void *)&num);if(ret == 0){printf("main:create thread success\n");}printf("main:%ld\n",(unsigned long)pthread_self());	pthread_join(t1,(void **)&pret);printf("main:ti quit %s\n",pret);//字符串的名字为地址 不需要加地址符return 0;
}

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

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

相关文章

接口返回HTML页面详解

import requests from bs4 import BeautifulSoup import re import jsonurl https://listado.mercadolibre.com.mx/hogar-muebles-jardin/cocina/almacenamiento-organizacion/organizadores-cocina/_CustId_570995983_PrCategId_AD# 添加 headers 和 cookies headers {User-…

JS函数全解、闭包、递归、柯里化

函数的返回值由什么确定&#xff1f; 影响因素&#xff1a; 1.调用时输入的参数params 2.定义时的环境env let x1 x let a 1 function f1(x1){return x1 a }a 3 {let a 2console.log(f1(x)) // x3} a 4// 这个例子说明a是定义时的a &#xff0c;而不是执行时的a …

深度学习网站集锦1

深度学习网站集锦 1. https://paperswithcode.com/导航栏论文和代码做了对应可以下载数据集角度看对应相关paper code看神经网络常用方法paper及实现code有什么用处还有哪些网站 1. https://paperswithcode.com/ 超简单实用&#xff0c;推荐的深度学习科研必备网站&#xff08…

第三周:Python能力复盘

资料&#xff1a; 《笨办法学Python》阅读地址&#xff1a;https://www.bookstack.cn/read/LearnPython3TheHardWay 《廖雪峰Python教程》阅读地址&#xff1a;http://t.cn/RK0qGu7 《机器学习numpy与pandas基础》&#xff1a;https://zhuanlan.zhihu.com/p/639733816 《matplo…

组态和SCADA

在工业自动化领域&#xff0c;"组态"&#xff08;SCADA&#xff0c;Supervisory Control and Data Acquisition&#xff09;是一种用于监控和控制工业过程的系统。它是一种集成了数据采集、实时监控、远程操作和数据分析等功能的软件系统。 组态系统通常由以下几个主…

智能网关是什么

智能网关&#xff08;Smart Gateway&#xff09;是一种设备或系统&#xff0c;用于连接和交互不同类型的设备、传感器、终端和网络。它充当连接物联网&#xff08;IoT&#xff09;设备和互联网的桥梁&#xff0c;提供数据传输、通信协议转换和智能控制等功能。 智能网关在物联…

java多个设计模式解决大量if-else堆积

当面对大量的 if-else 语句时&#xff0c;可以考虑使用以下几种常见的设计模式来减少代码的复杂性和维护成本&#xff1a; 策略模式&#xff08;Strategy Pattern&#xff09;&#xff1a;将各个分支的逻辑封装成不同的策略类&#xff0c;然后通过一个上下文类来根据条件选择合…

JAVA主流日志框架梳理学习及使用

前言&#xff1a;目前市面上有挺多JAVA的日志框架&#xff0c;比如JUL(JDK自带的日志框架),Log4j,Logback,Log4j2等&#xff0c;有人可能有疑问说还有slf4j&#xff0c;不过slf4j不是一种日志框架的具体实现&#xff0c;而是一种日志门面&#xff08;日志门面可以理解为是一种统…

Python---多任务的介绍

1. 提问 利用现学知识能够让两个函数或者方法同时执行吗? 不能&#xff0c;因为之前所写的程序都是单任务的&#xff0c;也就是说一个函数或者方法执行完成另外一个函数或者方法才能执行&#xff0c;要想实现这种操作就需要使用多任务。 多任务的最大好处是充分利用CPU资源&…

Python---多进程的使用

1 导入进程包 #导入进程包 import multiprocessing2. Process进程类的说明 Process([group [, target [, name [, args [, kwargs]]]]]) group&#xff1a;指定进程组&#xff0c;目前只能使用Nonetarget&#xff1a;执行的目标任务名name&#xff1a;进程名字args&#xff…

3800个字彻底弄清cortex

3800个字彻底弄清cortex arm内核发展历史cortexM0系列芯片系统框图通用寄存器m0特殊寄存器m3/m4/m7特殊寄存器 MSP和PSPxPSRPRIMASKCONTROLFAULTMASKBASEPRI 栈空间操作异常和中断 系统异常 NVIC可嵌套向量中断控制器系统操作寄存器 NVIC寄存器系统控制块SCB寄存器SysTick寄存…

如何用 Cargo 管理 Rust 工程系列 丁

以下内容为本人的学习笔记&#xff0c;如需要转载&#xff0c;请声明原文链接微信公众号「ENG八戒」https://mp.weixin.qq.com/s/PP9b5cSNd-7IqgNovcrB0A 优化输出 前面已经对 cargo package 工程编译输出了好多遍&#xff0c;发现编译结果打印的信息都包含了这个 unoptimize…

黑马React:基础拓展

黑马React: D10-基础拓展 Date: December 18, 2023 useReducer 基础使用 作用: 让 React 管理多个相对关联的状态数据 补充&#xff1a;和useState的作用类似&#xff0c;用来管理相对复杂的状态数据 **特点&#xff1a;**useReducer返回值为一个数组, 可以解构处数值stat…

C++共享和保护——(4)保护共享数据

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 一滴汗珠万粒粮&#xff0c;万粒汗珠谷…

【04】GeoScene导出海图或者电子航道图000数据成果

1创建一个带有覆盖面和定义的产品 如果你没有已存在的S-57数据&#xff0c;你可以通过捕捉新的产品覆盖范围&#xff08;多边形产品范围&#xff09;及其所需的产品定义信息&#xff08;产品元数据&#xff09;来为新产品创建基础。 注&#xff1a; 如果你已经有一个S-57数据…

js多图合成一张图

具体思路 先设置画布的宽高&#xff0c;再将每个图片整理成一个对象的数组通过某个方法传出合成后的base64 &#xff08;1&#xff09;、创建一个画布的类&#xff0c;他的属性是canvas虚拟dom和ctx &#xff08;2&#xff09;、构造器初始化convas对象、ctx、convas的宽高 …

【NI-RIO入门】使用LabVIEW进行数据采集测量

于ni kb摘录 选择合适的编程模式 CompactRIO系统具有至少两个用户可选模式。某些CompactRIO型号具有附加的用户可选模式&#xff0c;可以在实时NI-DAQmx中进行编程。请参考本文以判断您的CompactRIO是否能够使用实时NI-DAQmx。将目标添加到项目后&#xff0c;将提示您选择要使…

可以读通讯稿的组数

说在前面 &#x1f388;不知道大家对于算法的学习是一个怎样的心态呢&#xff1f;为了面试还是因为兴趣&#xff1f;不管是出于什么原因&#xff0c;算法学习需要持续保持。 题目描述 校运动会上&#xff0c;所有参赛同学身上都贴有他的参赛号码。某班参赛同学的号码记于数组 …

【《漫画算法》笔记】位图算法

问题描述 现有一个商店的数据库&#xff0c;它存储了很多顾客的信息&#xff08;如&#xff1a;姓名、年龄、身高、体重、职业等等&#xff0c;总之很多项&#xff09;。 如果想要筛选出“年龄大于25&#xff0c;且身高大于170&#xff0c;且体重大于130&#xff0c;且职业是程…

17、vue3(十七):数据大屏(二):地图效果,折线图效果,柱状图+折线图,散点图,雷达图

目录 一、数据大屏地图效果 1.创建地图、折线图文件夹,引入主页面