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

溫馨提示×

溫馨提示×

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

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

如何在C++11/14 中創建線程與分離線程

發布時間:2021-05-27 18:27:14 來源:億速云 閱讀:306 作者:Leah 欄目:編程語言

這篇文章給大家介紹如何在C++11/14 中創建線程與分離線程,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

線程的創建

讓我們看看示例代碼(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
$ ./t2
thread function
main thread

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

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

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

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

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

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

下圖是流程的流程圖

如何在C++11/14 中創建線程與分離線程

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

如何在C++11/14 中創建線程與分離線程

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

線程的分離

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

// t2.cpp
int 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
$ ./t2
main 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;
}

關于如何在C++11/14 中創建線程與分離線程就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

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

AI

白朗县| 湖南省| 宜良县| 崇文区| 长兴县| 万全县| 陵水| 湖南省| 太仓市| 武安市| 青海省| 宁南县| 山西省| 耿马| 合江县| 青浦区| 鄢陵县| 凌源市| 荥阳市| 尖扎县| 涿州市| 新昌县| 武川县| 五常市| 中阳县| 滦南县| 大厂| 大理市| 潮安县| 灵山县| 潜山县| 乌拉特后旗| 麻江县| 孟州市| 张北县| 贵港市| 探索| 崇仁县| 英吉沙县| 思南县| 长治县|