这篇文章主要介绍“linux创建线程的函数是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“linux创建线程的函数是什么”文章能帮助大家解决问题。
linux有创建线程的函数,即“pthread_create()”函数。该函数是类Unix操作系统中创建线程的函数,支持四个参数:参数1是指向线程标识符的指针、参数2用来设置线程属性、参数3是线程运行函数的起始地址、参数4是运行函数的参数。
本教程操作环境:linux5.9.8系统、Dell G3电脑。
linux创建线程的函数是pthread_create()函数
pthread_create()是类Unix操作系统(Unix、Linux、Mac OS X等)中创建线程的函数
头文件
#include<pthread.h>
函数声明
intpthread_create( pthread_t*restricttidp,//新创建的线程ID指向的内存单元。 constpthread_attr_t*restrictattr,//线程属性,默认为NULL void*(*start_rtn)(void*),//新创建的线程从start_rtn函数的地址开始运行 void*restrictarg//默认为NULL。上述函数需要参数,将参数放入结构中并将地址作为arg传入。 );
返回值
若成功则返回0,否则返回出错编号
参数
第一个参数为指向线程标识符的指针。
第二个参数用来设置线程属性。
第三个参数是线程运行函数的地址。
最后一个参数是运行函数的参数。
注意
在编译时注意加上-lpthread参数,以调用静态链接库。因为pthread并非Linux系统的默认库。
函数用法
#include<stdio.h> #include<string.h> #include<iostream> #include<pthread.h> #include<unistd.h> #include<vector> #include"main.h" usingnamespacestd; structSample{ uint32_tindex; charsex; uint32_tage; uint32_tresult; }; void*TaskEntry(void*args) { Sample*sa=(Sample*)args; uint32_tnum=sa->index; if(num==0){ printf("TaskEntryentrynum=0\n");//线程1执行体 sleep(10); printf("TaskEntryentrynum=0isover!!!\n"); }elseif(num==1){ printf("TaskEntryentrynum=1\n");//线程2执行体 sleep(10); printf("TaskEntryentrynum=1isover!!!\n"); }elseif(num==2){ printf("TaskEntryentrynum=2\n");//线程3执行体 sleep(2); printf("TaskEntryentrynum=2isover!!!\n"); } } uint32_tCreateTask(pthread_t&pid,Sample&sample) { //假设Sample.index==2创建任务失败,直接返回 if(sample.index==2){ return2; } pthread_attr_tattr;//设置线程属性 pthread_attr_init(&attr); pthread_attr_setstacksize(&attr,64*1024);//设置线程栈大小为64KB uint32_tret=pthread_create(&pid,&attr,(void*(*)(void*))TaskEntry,(void*)&sample); if(ret!=0){ returnret; } pthread_attr_destroy(&attr);//取消线程的设置属性 return0; } voidVerifyTask(vector<pthread_t>&taskID,vector<Sample>&taskArgs) { void*ret; for(intindex=0;index<2;index++){ //等待线程结束,释放相应的资源。pthread_join会堵塞主线程不会堵塞其他子线程,然后等待监控的线程执行完成,再返回主线程 //在此处线程执行顺序为:线程1--主线程--线程2--主线程--线程3 pthread_join(taskID[index],&ret);//堵塞主线程,执行子线程taskID[index],等待子线程taskID[index]执行完成释放资源 printf("task[%d]isover\n",index);//主线程执行打印操作 } } intmain(void) { //创建3个线程 vector<pthread_t>taskID(3); vector<Sample>taskArgs(3); for(inti=0;i<3;i++){ taskArgs[i]={i,'a',90,0}; uint32_tret=CreateTask(taskID[i],taskArgs[i]); if(ret!=0){ //模拟如下场景:任务创建失败,直接停止前面的任务 for(intj=0;j<i;j++){ pthread_cancel(taskID[j]);//子线程1和子线程2延迟10s,当线程3创建失败时,直接让其停止。 } //returnret;//主线程退出,所有子线程一起退出 } } VerifyTask(taskID,taskArgs);//校验线程是否结束 printf("threetheadisrunningover!!!\n"); return0; }
注意编译的使用需要加上编译选项-lpthread,比如:g++ -lpthread main.cpp -o main
关于“linux创建线程的函数是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注恒创行业资讯频道,小编每天都会为大家更新不同的知识点。
推荐阅读:java创建线程的方法