千家信息网

多线程pthread_create()函数的用法

发表于:2024-12-13 作者:千家信息网编辑
千家信息网最后更新 2024年12月13日,这篇文章主要讲解了"多线程pthread_create()函数的用法",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"多线程pthread_create(
千家信息网最后更新 2024年12月13日多线程pthread_create()函数的用法

这篇文章主要讲解了"多线程pthread_create()函数的用法",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"多线程pthread_create()函数的用法"吧!

总述:pthread_create是(Unix、Linux、Mac OS X)等操作系统的创建线程的函数。它的功能是创建线程(实际上就是确定调用该线程函数的入口点),在线程创建以后,就开始运行相关的线程函数。
pthread_create的返回值表示成功,返回0;表示出错,返回表示-1。

pthread_create函数如何创造线程
函数原型声明:

#include
int pthread_create(
pthread_t *restrict tidp, //新创建的线程ID指向的内存单元。
const pthread_attr_t *restrict attr, //线程属性,默认为NULL
void *(*start_rtn)(void *), //新创建的线程从start_rtn函数的地址开始运行
void *restrict arg //默认为NULL。若上述函数需要参数,将参数放入结构中并将地址作为arg传入。
);

1.传递参数注意的问题
问题:
避免直接在传递的参数中传递发生改变的量,否则会导致结果不可测。
即使是只再创造一个单线程,也可能在线程未获取传递参数时,线程获取的变量值已经被主线程进行了修改。

通常解决方案:
重新申请一块内存,存入需要传递的参数,再将这个地址作为arg传入。

2.使用时注意防止内存泄漏
在默认情况下通过pthread_create函数创建的线程是非分离属性的,由pthread_create函数的第二个参数决定,在非分离的情况下,当一个线程结束的时候,它所占用的系统资源并没有完全真正的释放,也没有真正终止。

只有在pthread_join函数返回时,该线程才会释放自己的资源。
或者是设置在分离属性的情况下,一个线程结束会立即释放它所占用的资源。

如果要保证创建线程之后,确保无内存泄漏,必须采用如下方法来规范pthread_create的使用:

1. 设置线程是detached(分离属性的)
void run() {
return;
}

int main(){
pthread_t thread;
pthread_attr_t attr;
pthread_attr_init( &attr );
pthread_attr_setdetachstate(&attr,1);
pthread_create(&thread, &attr, run, 0); //第二个参数决定了分离属性

//......
return 0;
}

但是,在博客:https://blog.csdn.net/qiurisuixiang/article/details/6648213评论中,有人提到:


2. 配套使用pthread_join函数
pthread_join()函数会一直阻塞调用线程,直到指定的线程终止。当pthread_join()返回之后,应用程序可回收与已终止线程关联的任何数据存储空间。
但是,同时需要注意,一定要和上面创建的某一线程配套使用,这样还可以起到互斥的作用。否则多线程可能抢占CPU资源,导致运行结果不确定。

牛客一道题目: 下面程序输出结果是什么?(不能确定)

#include
#include
#include

void* print1(void* data){
printf("1 ");
}

void* print2(void* data){
printf("2 ");
}

void* print3(void* data){
printf("3 ");
}

int main(void){
pthread_t t,t1,t2;

pthread_create(&t,0,print1,NULL);
pthread_create(&t1,0,print2,NULL);
pthread_create(&t2,0,print3,NULL);

pthread_join(t,NULL);
pthread_join(t1,NULL);
pthread_join(t2,NULL);
printf("\n");
}

分析:
在pthread_join()之前,3个线程都已提交,它们可能都已经顺序随机地执行了,也可能没有,所以结果也是不可预测的。不过这样也可以起到回收内存的作用吧?

//这样才是按顺序的。
pthread_create(&t, 0, print1, NULL);
pthread_join(t, NULL);
pthread_create(&t1, 0, print2, NULL);
pthread_join(t1, NULL);
pthread_create(&t2, 0, print3, NULL);
pthread_join(t2, NULL);

补充:pthread_join()函数
函数原型:

int pthread_join(
pthread_t tid, //需要等待的线程,指定的线程必须位于当前的进程中,而且不得是分离线程
void **status //线程tid所执行的函数返回值(返回值地址需要保证有效),其中status可以为NULL
);

pthread非linux系统的默认库, 需手动链接-线程库 -lpthread

返回值:
调用成功返回0.
ESRCH
描述: 没有找到与给定的线程ID 相对应的线程。(如果多个线程等待同一个线程终止,则所有等待线程将一直等到目标线程终止。然后一个等待线程成功返回。其余的等待线程将失败返回ESRCH错误)
EDEADLK
描述: 将出现死锁,如一个线程等待其本身,或者线程A和线程B 互相等待。
EINVAL
描述: 与给定的线程ID相对应的线程是分离线程。

感谢各位的阅读,以上就是"多线程pthread_create()函数的用法"的内容了,经过本文的学习后,相信大家对多线程pthread_create()函数的用法这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

线程 函数 参数 内存 属性 地址 情况 结果 资源 成功 系统 问题 学习 运行 作用 内容 原型 就是 程序 顺序 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 郑州系统软件开发如何收费 数据库安全性级别有哪些 迅雷数据库美女图片 攀枝花市公安局网络安全支队 澳洲软件开发工资标准 java软件开发面试大全 铁路局有软件开发吗 网络安全与技术毕业设计 XX公司网络安全管理方案 北京市天气预报软件开发 软件开发短期个人职业规划 华服互联网科技知乎 高淳区旅游app软件开发 广州千课互联网科技有限公司 重庆璧山水果软件开发 数据库客户端现在都用哪款 互联网公司高灯科技有限公司 规模大的软件开发哪家好 软件开发中的基本问题 数据库显示索引的代码 山西租用gpu服务器收费 电信网络安全比赛 我的世界服务器怎么与qq群互通 网络安全知识竞赛颁奖典礼 产品经理需要开发数据库结构吗 网络安全知识预防网络成迷 物联网网络技术实训报告 软件服务器没有开启或意外退出 北华大学数据库期末考试 网络安全评价词
0