linux創(chuàng)建線程的函數(shù)是什么

這篇文章主要介紹“l(fā)inux創(chuàng)建線程的函數(shù)是什么”的相關(guān)知識,小編通過實(shí)際案例向大家展示操作過程,操作方法簡單快捷,實(shí)用性強(qiáng),希望這篇“l(fā)inux創(chuàng)建線程的函數(shù)是什么”文章能幫助大家解決問題。

我們提供的服務(wù)有:成都網(wǎng)站制作、做網(wǎng)站、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、高臺ssl等。為超過千家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的高臺網(wǎng)站制作公司

linux有創(chuàng)建線程的函數(shù),即“pthread_create()”函數(shù)。該函數(shù)是類Unix操作系統(tǒng)中創(chuàng)建線程的函數(shù),支持四個參數(shù):參數(shù)1是指向線程標(biāo)識符的指針、參數(shù)2用來設(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,否則返回出錯編號

參數(shù)

  • 第一個參數(shù)為指向線程標(biāo)識符的指針。

  • 第二個參數(shù)用來設(shè)置線程屬性。

  • 第三個參數(shù)是線程運(yùn)行函數(shù)的地址。

  • 最后一個參數(shù)是運(yùn)行函數(shù)的參數(shù)。

注意

在編譯時注意加上-lpthread參數(shù),以調(diào)用靜態(tài)鏈接庫。因?yàn)閜thread并非Linux系統(tǒng)的默認(rèn)庫。

函數(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會堵塞主線程不會堵塞其他子線程,然后等待監(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個線程
    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) {
            // 模擬如下場景:任務(wù)創(chuàng)建失敗,直接停止前面的任務(wù)
            for (int j = 0; j<i; j++) {
                pthread_cancel(taskID[j]); // 子線程1和子線程2延遲10s,當(dāng)線程3創(chuàng)建失敗時,直接讓其停止。
            }
            //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)的知識,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,小編每天都會為大家更新不同的知識點(diǎn)。

分享題目:linux創(chuàng)建線程的函數(shù)是什么
文章出自:http://bm7419.com/article14/igspge.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供動態(tài)網(wǎng)站定制開發(fā)、營銷型網(wǎng)站建設(shè)軟件開發(fā)、企業(yè)網(wǎng)站制作、全網(wǎng)營銷推廣

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化