概述
本教程操作环境: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 = 0n"); // 线程1执行体
sleep(10);
printf("TaskEntry entry num = 0 is over!!!n");
} else if (num == 1) {
printf("TaskEntry entry num = 1n"); // 线程2执行体
sleep(10);
printf("TaskEntry entry num = 1 is over!!!n");
} else if (num == 2) {
printf("TaskEntry entry num = 2n"); // 线程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<2; index++) {
// 等待线程结束,释放相应的资源。pthread_join会堵塞主线程不会堵塞其他子线程,然后等待监控的线程执行完成,再返回主线程
// 在此处线程执行顺序为:线程1--主线程--线程2--主线程--线程3
pthread_join(taskID[index], &ret); // 堵塞主线程,执行子线程taskID[index],等待子线程taskID[index]执行完成释放资源
printf("task[%d] is overn", 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<i; 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视频教程》
以上就是linux有创建线程的函数吗的详细内容,更多请关注靠谱客其它相关文章!
最后
以上就是曾经钻石为你收集整理的linux有创建线程的函数吗的全部内容,希望文章能够帮你解决linux有创建线程的函数吗所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复