最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

線程的創(chuàng)建

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

#include <iostream>
#include <thread>

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

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

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

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

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

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

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

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

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

請注意,我們在線程的函數(shù)和類的聲明中有一個新的標準C++庫頭文件#include <thread>

下圖是流程的流程圖

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

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

線程的分離

我們可以創(chuàng)建一個新線程使其運行為自由的守護進程。

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

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

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

注意,分離線程沒有改變打印輸出到標準輸出stdout,因為主線程已經(jīng)結束并退出。

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

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

因此,為了使代碼正常工作,主線程應該允許我們的子線程訪問資源。

一旦一個線程分離,我們不能強迫它與主線程重新連接。因此,下面的代碼行是錯誤的,程序會崩潰。

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

一旦脫離,線程就應該永遠是脫離狀態(tài).

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

因為它joinable()返回為false,join()函數(shù)不會被調(diào)用,程序運行不會崩潰。

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

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

最新評論

南雄市| 尚义县| 荆州市| 老河口市| 马龙县| 富川| 金乡县| 长白| 闽清县| 高台县| 德化县| 堆龙德庆县| 五指山市| 奇台县| 红桥区| 东城区| 五常市| 怀宁县| 青冈县| 连江县| 长治县| 循化| 金秀| 南充市| 长乐市| 神池县| 边坝县| 夏津县| 清水河县| 海兴县| 玛纳斯县| 藁城市| 茂名市| 南丹县| 扶沟县| 舒城县| 武强县| 商洛市| 福建省| 称多县| 溆浦县|