意见箱
恒创运营部门将仔细参阅您的意见和建议,必要时将通过预留邮箱与您保持联络。感谢您的支持!
意见/建议
提交建议

linux创建线程的函数是什么

来源:恒创科技 编辑:恒创科技编辑部
2023-12-02 18:17:59

这篇文章主要介绍“linux创建线程的函数是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“linux创建线程的函数是什么”文章能帮助大家解决问题。

linux有创建线程的函数,即“pthread_create()”函数。该函数是类Unix操作系统中创建线程的函数,支持四个参数:参数1是指向线程标识符的指针、参数2用来设置线程属性、参数3是线程运行函数的起始地址、参数4是运行函数的参数。


linux创建线程的函数是什么

本教程操作环境: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创建线程的方法

上一篇: linux如何比较文件不同 下一篇: Redis有序集合如何使用