這篇文章主要介紹“l(fā)inux創(chuàng)建線程的函數(shù)是什么”的相關(guān)知識(shí),小編通過實(shí)際案例向大家展示操作過程,操作方法簡(jiǎn)單快捷,實(shí)用性強(qiáng),希望這篇“l(fā)inux創(chuàng)建線程的函數(shù)是什么”文章能幫助大家解決問題。
我們提供的服務(wù)有:成都網(wǎng)站制作、做網(wǎng)站、微信公眾號(hào)開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、高臺(tái)ssl等。為超過千家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的高臺(tái)網(wǎng)站制作公司
linux有創(chuàng)建線程的函數(shù),即“pthread_create()”函數(shù)。該函數(shù)是類Unix操作系統(tǒng)中創(chuàng)建線程的函數(shù),支持四個(gè)參數(shù):參數(shù)1是指向線程標(biāo)識(shí)符的指針、參數(shù)2用來(lái)設(shè)置線程屬性、參數(shù)3是線程運(yùn)行函數(shù)的起始地址、參數(shù)4是運(yùn)行函數(shù)的參數(shù)。
本教程操作環(huán)境:linux5.9.8系統(tǒng)、Dell G3電腦。
linux創(chuàng)建線程的函數(shù)是pthread_create()函數(shù)
pthread_create()是類Unix操作系統(tǒng)(Unix、Linux、Mac OS X等)中創(chuàng)建線程的函數(shù)
頭文件
#include<pthread.h>
函數(shù)聲明
int pthread_create( pthread_t *restrict tidp, //新創(chuàng)建的線程ID指向的內(nèi)存單元。 const pthread_attr_t *restrict attr, //線程屬性,默認(rèn)為NULL void *(*start_rtn)(void *), //新創(chuàng)建的線程從start_rtn函數(shù)的地址開始運(yùn)行 void *restrict arg //默認(rèn)為NULL。上述函數(shù)需要參數(shù),將參數(shù)放入結(jié)構(gòu)中并將地址作為arg傳入。 );
返回值
若成功則返回0,否則返回出錯(cuò)編號(hào)
參數(shù)
第一個(gè)參數(shù)為指向線程標(biāo)識(shí)符的指針。
第二個(gè)參數(shù)用來(lái)設(shè)置線程屬性。
第三個(gè)參數(shù)是線程運(yùn)行函數(shù)的地址。
最后一個(gè)參數(shù)是運(yùn)行函數(shù)的參數(shù)。
注意
在編譯時(shí)注意加上-lpthread參數(shù),以調(diào)用靜態(tài)鏈接庫(kù)。因?yàn)閜thread并非Linux系統(tǒng)的默認(rèn)庫(kù)。
函數(shù)用法
#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執(zhí)行體 sleep(10); printf("TaskEntry entry num = 0 is over!!!\n"); } else if (num == 1) { printf("TaskEntry entry num = 1\n"); // 線程2執(zhí)行體 sleep(10); printf("TaskEntry entry num = 1 is over!!!\n"); } else if (num == 2) { printf("TaskEntry entry num = 2\n"); // 線程3執(zhí)行體 sleep(2); printf("TaskEntry entry num = 2 is over!!!\n"); } } uint32_t CreateTask(pthread_t& pid, Sample& sample) { // 假設(shè)Sample.index == 2創(chuàng)建任務(wù)失敗,直接返回 if (sample.index == 2) { return 2; } pthread_attr_t attr; // 設(shè)置線程屬性 pthread_attr_init(&attr); pthread_attr_setstacksize(&attr, 64 * 1024); // 設(shè)置線程棧大小為64KB uint32_t ret = pthread_create(&pid, &attr, (void*(*)(void*))TaskEntry, (void*)&sample); if (ret != 0) { return ret; } pthread_attr_destroy(&attr); // 取消線程的設(shè)置屬性 return 0; } void VerifyTask(vector<pthread_t>& taskID, vector<Sample>& taskArgs) { void *ret; for (int index = 0; index<2; index++) { // 等待線程結(jié)束,釋放相應(yīng)的資源。pthread_join會(huì)堵塞主線程不會(huì)堵塞其他子線程,然后等待監(jiān)控的線程執(zhí)行完成,再返回主線程 // 在此處線程執(zhí)行順序?yàn)椋壕€程1--主線程--線程2--主線程--線程3 pthread_join(taskID[index], &ret); // 堵塞主線程,執(zhí)行子線程taskID[index],等待子線程taskID[index]執(zhí)行完成釋放資源 printf("task[%d] is over\n", index); // 主線程執(zhí)行打印操作 } } int main(void) { // 創(chuàng)建3個(gè)線程 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) { // 模擬如下場(chǎng)景:任務(wù)創(chuàng)建失敗,直接停止前面的任務(wù) for (int j = 0; j<i; j++) { pthread_cancel(taskID[j]); // 子線程1和子線程2延遲10s,當(dāng)線程3創(chuàng)建失敗時(shí),直接讓其停止。 } //return ret; // 主線程退出,所有子線程一起退出 } } VerifyTask(taskID, taskArgs); // 校驗(yàn)線程是否結(jié)束 printf("three thead is running over!!!\n"); return 0; }
注意編譯的使用需要加上編譯選項(xiàng)-lpthread,比如:g++ -lpthread main.cpp -o main
關(guān)于“l(fā)inux創(chuàng)建線程的函數(shù)是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí),可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,小編每天都會(huì)為大家更新不同的知識(shí)點(diǎn)。
分享題目:linux創(chuàng)建線程的函數(shù)是什么
文章出自:http://muchs.cn/article14/igspge.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供動(dòng)態(tài)網(wǎng)站、定制開發(fā)、營(yíng)銷型網(wǎng)站建設(shè)、軟件開發(fā)、企業(yè)網(wǎng)站制作、全網(wǎng)營(yíng)銷推廣
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)