linux線程創建函數
pthread_create函數是(linux/unix/macos)等操作系統的創建線程的函數,它的功能是創建線程。
函數原型如下:
#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傳入。
);
函數用法
#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<2; 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<i; j++) {
pthread_cancel(taskID[j]); // 子線程1和子線程2延遲10s,當線程3創建失敗時,直接讓其停止。
}
//return ret; // 主線程退出,所有子線程一起退出
}
}
VerifyTask(taskID, taskArgs); // 校驗線程是否結束
printf("three thead is running over!!!\n");
return 0;
}