91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

linux創建線程的函數是什么

發布時間:2022-03-25 16:38:47 來源:億速云 閱讀:699 作者:iii 欄目:建站服務器

這篇文章主要介紹“linux創建線程的函數是什么”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“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<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;
}

注意編譯的使用需要加上編譯選項-lpthread,比如:g++ -lpthread main.cpp -o main

關于“linux創建線程的函數是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

兰坪| 东方市| 琼海市| 星子县| 吉木萨尔县| 丹凤县| 昭觉县| 剑阁县| 柳江县| 沅陵县| 德保县| 莆田市| 桃园市| 宜兰市| 许昌县| 准格尔旗| 手游| 伊春市| 镇雄县| 周宁县| 邯郸市| 西林县| 乐平市| 文成县| 玉门市| 兴城市| 梅州市| 华坪县| 邵东县| 缙云县| 武山县| 江孜县| 通许县| 横山县| 烟台市| 伊宁市| 衡山县| 南郑县| 庐江县| 资阳市| 乌恰县|