问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

小弟刚学多线程,请教老大们

发布网友 发布时间:2023-07-17 01:20

我来回答

1个回答

热心网友 时间:2024-11-17 03:04

简单的多线程编程
Linux系统下的多线程遵循POSIX线程接口,称为pthread。编写Linux下的多线程程序,需要使用头文件pthread.h,连接时需 要使用库libpthread.a。顺便说一下,Linux下pthread的实现是通过系统调用clone()来实现的。clone()是Linux所 特有的系统调用,它的使用方式类似fork,关于clone()的详细情况,有兴趣的读者可以去查看有关文档说明。下面我们展示一个最简单的多线程程序 example1.c。
/* example.c*/
#include <stdio.h>
#include <pthread.h>
void thread(void)
{
int i;
for(i=0;i<3;i++)
printf("This is a pthread.\n");
}

int main(void)
{
pthread_t id;
int i,ret;
ret=pthread_create(&id,NULL,(void *) thread,NULL);
if(ret!=0){
printf ("Create pthread error!\n");
exit (1);
}
for(i=0;i<3;i++)
printf("This is the main process.\n");
pthread_join(id,NULL);
return (0);
}

我们编译此程序:
gcc example1.c -lpthread -o example1
运行example1,我们得到如下结果:
This is the main process.
This is a pthread.
This is the main process.
This is the main process.
This is a pthread.
This is a pthread.
再次运行,我们可能得到如下结果:
This is a pthread.
This is the main process.
This is a pthread.
This is the main process.
This is a pthread.
This is the main process.

前后两次结果不一样,这是两个线程争夺CPU资源的结果。上面的示例中,我们使用到了两个函数, pthread_create和pthread_join,并声明了一个pthread_t型的变量。
pthread_t在头文件/usr/include/bits/pthreadtypes.h中定义:
typedef unsigned long int pthread_t;
它是一个线程的标识符。函数pthread_create用来创建一个线程,它的原型为:
extern int pthread_create __P ((pthread_t *__thread, __const pthread_attr_t *__attr,
void *(*__start_routine) (void *), void *__arg));
第一个参数为指向线程标识符的指针,第二个参数用来设置线程属性,第三个参数是线程运行函数的起始地址,最后一个参数是运行函数的参数。这里,我们的 函数thread不需要参数,所以最后一个参数设为空指针。第二个参数我们也设为空指针,这样将生成默认属性的线程。对线程属性的设定和修改我们将在下一 节阐述。当创建线程成功时,函数返回0,若不为0则说明创建线程失败,常见的错误返回代码为EAGAIN和EINVAL。前者表示系统*创建新的线程, 例如线程数目过多了;后者表示第二个参数代表的线程属性值非法。创建线程成功后,新创建的线程则运行参数三和参数四确定的函数,原来的线程则继续运行下一 行代码。
函数pthread_join用来等待一个线程的结束。函数原型为:
extern int pthread_join __P ((pthread_t __th, void **__thread_return));
第一个参数为被等待的线程标识符,第二个参数为一个用户定义的指针,它可以用来存储被等待线程的返回值。这个函数是一个线程阻塞的函数,调用它的函数 将一直等待到被等待的线程结束为止,当函数返回时,被等待线程的资源被收回。一个线程的结束有两种途径,一种是象我们上面的例子一样,函数结束了,调用它 的线程也就结束了;另一种方式是通过函数pthread_exit来实现。它的函数原型为:
extern void pthread_exit __P ((void *__retval)) __attribute__ ((__noreturn__));
唯一的参数是函数的返回代码,只要pthread_join中的第二个参数thread_return不是NULL,这个值将被传递给 thread_return。最后要说明的是,一个线程不能被多个线程等待,否则第一个接收到信号的线程成功返回,其余调用pthread_join的线 程则返回错误代码ESRCH。
在这一节里,我们编写了一个最简单的线程,并掌握了最常用的三个函数pthread_create,pthread_join和pthread_exit。下面,我们来了解线程的一些常用属性以及如何设置这些属性。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
手机导航地图语音怎么下载 如何分别真金和仿金首饰 怎样区分真金和仿金首饰呢 小学生新年晚会主持人的串词!!(不要太多)急 大大后天就需要了!!!_百度... 周年晚会策划公司 奥格瑞玛传送门大厅在哪 奥格瑞玛传送门大厅怎么走 锻炼颈椎的几个动作 水多久能结冰 冰能在多长时间内形成 请问水低于0度会结冰吗? 如何防止脱发严重 中国最好的纸产字哪里 中国最出名的纸产自哪里? 什么情况下可以免征个人所得税 一场春雨过后笋芽儿像什么一样什么? 小学二年级语文下册竹笋像什么 三星领世旗舰8采用什么处理器? 请问在性能方面处理器AMD Athlon×2 TK—53 好 还是AMD Athlon×2 TK... AMD闪龙3500+和速龙TK53 那个好些? 关于amd 笔记本cpu tk53的一些问题 AMD Turion64 X2 TK-53 大家评价一下这款CPU:AMD 双核速龙64 TK-53 amd athlon(tm) tk53 和闪龙3600 哪个更好点呢? 我想对你说作文500字600字 李察的酒瓶值多少钱? xx我想对你说 作文290字 作文《伯诺德夫人我想对你说》300字 女友说我说话像写作文 鲜暇时光注册过商标吗?还有哪些分类可以注册? qq怎么查绑定的手机号码 网页设计中,竖直排放图片之间的距离如何设置空格的距离太大了,想小... 乌鸡白凤丸用黄酒服用效果会更好吗? 乌鸡白凤丸有什么效果? 如违法生产经营种子记录证明模板怎么写? 如何把迅雷设置成,一个任务下载完后自动下载下一个任务?求大神帮助 怎么让迅雷下载完一个任务后自动下载另一个任务? 用迅雷下载东西,怎么让它在一个任务完成后自动开始另一个新的任务? 用迅雷下载任务,怎么能一次下载一个任务,下载完一个后,不用我动手自动... 怎么才能让迅雷连续下载 我的是迅雷5 在迅雷上,待下载的文件如何一个接一个的自动下载? 用脚后跟和后脑勺使身体悬空叫什么动作 每层筛子的砂样是何种直径的砂子 蛋白质是混合物? 为什么说蛋白质不是一种纯净物 蛋白质酸高分子化合物吗?它不是混合物吗 DNA 和蛋白质 是化合物吗 重难点上说蛋白质既属于天然高分子化合物也为混合物前后不一请问这是怎... 长牡蛎的分布生境 广电网络的猫的网络接口线的灯不亮导致路由器无法使用 速度,我要上 ... 广电宽带猫上只有一个RJ45接口怎么连接路由器 天师大2022英语考博只有翻译题吗论坛?