站長資訊網
        最全最豐富的資訊網站

        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>

        函數聲明

        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

        贊(0)
        分享到: 更多 (0)
        網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
        主站蜘蛛池模板: 九九热在线视频观看这里只有精品 | 3D动漫精品啪啪一区二区下载| 日韩精品成人一区二区三区| 亚洲精品无码乱码成人| 99精品电影一区二区免费看| 国产精品毛片无遮挡| 亚洲国产精品碰碰| 国产精品gz久久久| 99国产精品久久| 久久影院综合精品| 亚洲国产主播精品极品网红| 国产精品第一区第27页| 国产成人久久精品区一区二区| 亚洲精品国偷自产在线| 三级国产精品| 久久露脸国产精品| 国产精品自在在线午夜福利| 亚洲欧洲国产日韩精品| 成人午夜精品视频在线观看| 精品无码一区二区三区爱欲九九| 亚洲视频在线精品| 四虎成人精品| 日韩一区二区三区在线精品| 久久精品国产精品亚洲人人| 国产精品亚洲玖玖玖在线观看| 中文精品久久久久国产网址| 欧美精品黑人巨大在线播放| 极品精品国产超清自在线观看| 国产精品人成在线播放新网站 | 国产成人精品免费视频大| 人妻少妇精品中文字幕AV| 一本一本久久aa综合精品| 无翼乌无遮挡全彩老师挤奶爱爱帝国综合社区精品| 国产精品成人h片在线| 国产高清在线精品一本大道| 国产精品人成在线观看| 精品国产成人国产在线观看| 国产午夜精品久久久久九九电影| 国产综合精品蜜芽| 免费视频精品一区二区| 亚洲精品无码成人片在线观看|