欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++11/14 線程的創(chuàng)建與分離的實(shí)現(xiàn)

 更新時(shí)間:2019年01月22日 14:46:33   作者:lesliefish  
這篇文章主要介紹了C++11/14 線程的創(chuàng)建與分離的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

線程的創(chuàng)建

讓我們看看示例代碼(t1.cpp).

#include <iostream>
#include <thread>

void thread_function()
{
  std::cout << "thread function\n";
}

int main()
{
  std::thread t(&thread_function);  // 線程 t 開始運(yùn)行
  std::cout << "main thread\n";
  t.join();             // 主線程等待子線程結(jié)束
  return 0;
}

代碼在linux系統(tǒng)下將輸出:

$ g++ t1.cpp -o t1 -std=c++11 -pthread
$ ./t2
thread function
main thread

我們要做的第一件事是創(chuàng)建一個(gè)線程對(duì)象(工作線程),并給它一個(gè)函數(shù)形式的任務(wù)進(jìn)行工作。

主線程希望等待線程成功完成。

所以,我們使用join(). 如果最初的主線程不等待新線程執(zhí)行完成,那么它會(huì)繼續(xù)執(zhí)行main()函數(shù)之后的代碼,可能在新線程執(zhí)行完畢前結(jié)束程序。

當(dāng)主線程在等待時(shí),主線程處于空閑狀態(tài)。

實(shí)際上,操作系統(tǒng)可能會(huì)把CPU資源從主線程上移走。

請(qǐng)注意,我們?cè)诰€程的函數(shù)和類的聲明中有一個(gè)新的標(biāo)準(zhǔn)C++庫(kù)頭文件#include <thread>。

下圖是流程的流程圖

然而,在實(shí)際執(zhí)行中,事情并不是那么理想,更可能是不對(duì)稱的。也許,它看起來(lái)更像下面這張圖片。

當(dāng)工作線程開始構(gòu)造std::thread t的時(shí)候,可能會(huì)有創(chuàng)建時(shí)的開銷(通過(guò)使用線程池可以減少此開銷),圖中虛線表示可能的阻塞狀態(tài)。

線程的分離

我們可以創(chuàng)建一個(gè)新線程使其運(yùn)行為自由的守護(hù)進(jìn)程。

// t2.cpp
int main()
{
  std::thread t(&thread;_function);
  std::cout << "main thread\n";
  // t.join();
  t.detach();
  return 0;
}

分離的子線程現(xiàn)在是自由的,并自行運(yùn)行。它變成了一個(gè)守護(hù)進(jìn)程。

$ g++ t2.cpp -o t2 -std=c++11 -pthread
$ ./t2
main thread

注意,分離線程沒有改變打印輸出到標(biāo)準(zhǔn)輸出stdout,因?yàn)橹骶€程已經(jīng)結(jié)束并退出。

這是多線程編程的特點(diǎn)之一:我們不能確定哪個(gè)線程首先運(yùn)行 (不確定性,除非我們使用同步機(jī)制。). 在我們的例子中,由于創(chuàng)建一個(gè)新線程需要一定的時(shí)間,主線程最有可能比子線程率先執(zhí)行完畢。

還有一點(diǎn)我們需要注意的是,即使在這個(gè)簡(jiǎn)單的代碼中,我們也在共享一個(gè)公共資源:std::cout。

因此,為了使代碼正常工作,主線程應(yīng)該允許我們的子線程訪問(wèn)資源。

一旦一個(gè)線程分離,我們不能強(qiáng)迫它與主線程重新連接。因此,下面的代碼行是錯(cuò)誤的,程序會(huì)崩潰。

int main()
{
  std::thread t(&thread;_function);
  std::cout << "main thread\n";
  // t.join();
  t.detach();
  t.join();  // Error
  return 0;
}

一旦脫離,線程就應(yīng)該永遠(yuǎn)是脫離狀態(tài).

我們可以使用joinable()把代碼做崩潰前的檢查。

因?yàn)樗黬oinable()返回為false,join()函數(shù)不會(huì)被調(diào)用,程序運(yùn)行不會(huì)崩潰。

int main()
{
  std::thread t(&thread;_function);
  std::cout << "main thread\n";
  // t.join();
  if(t.joinable()) 
    t.join(); 
  return 0;
}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C++實(shí)現(xiàn)四則運(yùn)算器(無(wú)括號(hào))

    C++實(shí)現(xiàn)四則運(yùn)算器(無(wú)括號(hào))

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)四則運(yùn)算器,無(wú)括號(hào)的計(jì)算器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • C++雙線程調(diào)用網(wǎng)絡(luò)攝像頭與多線程調(diào)用多攝像頭同步執(zhí)行方法詳細(xì)講解

    C++雙線程調(diào)用網(wǎng)絡(luò)攝像頭與多線程調(diào)用多攝像頭同步執(zhí)行方法詳細(xì)講解

    這篇文章主要介紹了C++雙線程調(diào)用網(wǎng)絡(luò)攝像頭與多線程調(diào)用多攝像頭同步執(zhí)行方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧
    2022-11-11
  • C語(yǔ)言中文件常見操作的示例詳解

    C語(yǔ)言中文件常見操作的示例詳解

    FILE為C語(yǔ)言提供的文件類型,它是一個(gè)結(jié)構(gòu)體類型,用于存放文件的相關(guān)信息。本文主要為大家介紹下C語(yǔ)言中幾個(gè)常見的文件操作的實(shí)現(xiàn),需要的可以參考一下
    2022-12-12
  • 在C語(yǔ)言中轉(zhuǎn)換時(shí)間的基本方法介紹

    在C語(yǔ)言中轉(zhuǎn)換時(shí)間的基本方法介紹

    這篇文章主要介紹了在C語(yǔ)言中轉(zhuǎn)換時(shí)間的基本方法,分別是mktime()函數(shù)和localtime()函數(shù)的使用,需要的朋友可以參考下
    2015-08-08
  • C++圖文并茂分析講解模板

    C++圖文并茂分析講解模板

    C++語(yǔ)言的模板技術(shù)包括函數(shù)模板和類模板,模板技術(shù)是一種代碼重用技術(shù),函數(shù)和類是C++語(yǔ)言中兩種主要的重用代碼形式,這篇文章主要介紹了C++函數(shù)模板和類模板,需要的朋友可以參考下
    2022-09-09
  • OpenCV實(shí)現(xiàn)區(qū)域分割和區(qū)域生長(zhǎng)

    OpenCV實(shí)現(xiàn)區(qū)域分割和區(qū)域生長(zhǎng)

    區(qū)域分割是圖像處理中一個(gè)重要的任務(wù),本文主要介紹了OpenCV實(shí)現(xiàn)區(qū)域分割和區(qū)域生長(zhǎng),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-02-02
  • 如何通過(guò)C++求出鏈表中環(huán)的入口結(jié)點(diǎn)

    如何通過(guò)C++求出鏈表中環(huán)的入口結(jié)點(diǎn)

    本文主要介紹了通過(guò)C++求解鏈表中環(huán)的入口結(jié)點(diǎn),即給一個(gè)長(zhǎng)度為n鏈表,若其中包含環(huán),請(qǐng)找出該鏈表的環(huán)的入口結(jié)點(diǎn),否則,返回null。需要的朋友可以參考一下
    2021-12-12
  • C語(yǔ)言版實(shí)現(xiàn)三子棋游戲

    C語(yǔ)言版實(shí)現(xiàn)三子棋游戲

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言版實(shí)現(xiàn)三子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • C++指針與數(shù)組:指針詳解

    C++指針與數(shù)組:指針詳解

    本文從初學(xué)者的角度,深入淺出地講解C++中的指針、數(shù)組指針,對(duì)最?;煜囊脗鬟f、值傳遞和指針傳遞做了區(qū)處,需要的朋友可以參考下
    2021-09-09
  • C/C++語(yǔ)言宏定義使用實(shí)例詳解

    C/C++語(yǔ)言宏定義使用實(shí)例詳解

    這篇文章主要介紹了 C/C++語(yǔ)言宏定義使用實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-06-06

最新評(píng)論