国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

C++11/14 線程的創建與分離的實現

2020-01-26 13:33:18
字體:
來源:轉載
供稿:網友

線程的創建

讓我們看看示例代碼(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系統下將輸出:

$ g++ t1.cpp -o t1 -std=c++11 -pthread$ ./t2thread functionmain thread

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

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

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

當主線程在等待時,主線程處于空閑狀態。

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

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

下圖是流程的流程圖

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

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

線程的分離

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

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

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

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

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

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

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

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

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

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

一旦脫離,線程就應該永遠是脫離狀態.

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

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

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 靖江市| 新源县| 肇州县| 陵水| 兴城市| 土默特左旗| 江孜县| 芦山县| 洞头县| 增城市| 忻城县| 班戈县| 石景山区| 安仁县| 西乌珠穆沁旗| 内乡县| 屏山县| 铜梁县| 湟中县| 辰溪县| 和田市| 白沙| 肇东市| 玉屏| 漳州市| 绥德县| 濉溪县| 临颍县| 德令哈市| 溧阳市| 鄂尔多斯市| 社旗县| 云和县| 涿州市| 阳曲县| 安多县| 康定县| 昭觉县| 康定县| 永兴县| 衡山县|