linux创建线程的函数是什么

66次阅读
没有评论

共计 2728 个字符,预计需要花费 7 分钟才能阅读完成。

这篇文章主要介绍“linux 创建线程的函数是什么”的相关知识,丸趣 TV 小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“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

函数声明

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 传入。 );

返回值

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

参数

第一个参数为指向线程标识符的指针。

第二个参数用来设置线程属性。

第三个参数是线程运行函数的地址。

最后一个参数是运行函数的参数。

注意

在编译时注意加上 -lpthread 参数,以调用静态链接库。因为 pthread 并非 Linux 系统的默认库。

函数用法

#include  stdio.h 
#include  string.h 
#include  iostream 
#include  pthread.h 
#include  unistd.h 
#include  vector 
#include  main.h 
using namespace std;
struct Sample {
 uint32_t index;
 char sex;
 uint32_t age;
 uint32_t result;
void* TaskEntry(void *args)
 Sample *sa = (Sample*)args;
 uint32_t num = sa- index;
 if (num == 0) {
 printf( TaskEntry entry num = 0\n  //  线程 1 执行体
 sleep(10);
 printf( TaskEntry entry num = 0 is over!!!\n 
 } else if (num == 1) {
 printf( TaskEntry entry num = 1\n  //  线程 2 执行体
 sleep(10);
 printf( TaskEntry entry num = 1 is over!!!\n 
 } else if (num == 2) {
 printf( TaskEntry entry num = 2\n  //  线程 3 执行体
 sleep(2);
 printf( TaskEntry entry num = 2 is over!!!\n 
 }
uint32_t CreateTask(pthread_t  pid, Sample  sample)
 //  假设 Sample.index == 2 创建任务失败,直接返回
 if (sample.index == 2) {
 return 2;
 }
 pthread_attr_t attr; //  设置线程属性
 pthread_attr_init(attr);
 pthread_attr_setstacksize(attr, 64 * 1024); //  设置线程栈大小为 64KB
 uint32_t ret = pthread_create(pid,  attr, (void*(*)(void*))TaskEntry, (void*) sample);
 if (ret != 0) {
 return ret;
 }
 pthread_attr_destroy(attr); //  取消线程的设置属性
 return 0;
void VerifyTask(vector pthread_t  taskID, vector Sample  taskArgs)
 void *ret;
 for (int index = 0; index  index++) {
 //  等待线程结束,释放相应的资源。pthread_join 会堵塞主线程不会堵塞其他子线程,然后等待监控的线程执行完成,再返回主线程
 //  在此处线程执行顺序为:线程 1 -- 主线程 -- 线程 2 -- 主线程 -- 线程 3
 pthread_join(taskID[index],  ret); //  堵塞主线程,执行子线程 taskID[index],等待子线程 taskID[index] 执行完成释放资源
 printf(task[%d] is over\n , index); //  主线程执行打印操作
 }
int main(void)
 //  创建 3 个线程
 vector pthread_t  taskID(3);
 vector Sample  taskArgs(3);
 for (int i = 0; i   3; i++) { taskArgs[i] = { i,  a , 90, 0};
 uint32_t ret = CreateTask(taskID[i], taskArgs[i]);
 if (ret != 0) {
 //  模拟如下场景:任务创建失败,直接停止前面的任务
 for (int j = 0; j  j++) { pthread_cancel(taskID[j]); //  子线程 1 和子线程 2 延迟 10s,当线程 3 创建失败时,直接让其停止。 }
 //return ret; //  主线程退出,所有子线程一起退出
 }
 }
 VerifyTask(taskID, taskArgs); //  校验线程是否结束
 printf( three thead is running over!!!\n 
 return 0;
}

注意编译的使用需要加上编译选项 -lpthread,比如:g++ -lpthread main.cpp -o main

关于“linux 创建线程的函数是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注丸趣 TV 行业资讯频道,丸趣 TV 小编每天都会为大家更新不同的知识点。

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-03发表,共计2728字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)