C++程序中啟動(dòng)線程的方法
C++11 引入一個(gè)全新的線程庫(kù),包含啟動(dòng)和管理線程的工具,提供了同步(互斥、鎖和原子變量)的方法,我將試圖為你介紹這個(gè)全新的線程庫(kù)。
如果你要編譯本文中的代碼,你至少需要一個(gè)支持 C++11 的編譯器,我使用的是 GCC 4.6.1,需要使用 -c++0x 或者 -c++11 參數(shù)來(lái)啟用 C++11 的支持。
啟動(dòng)線程
在 C++11 中啟動(dòng)一個(gè)線程是非常簡(jiǎn)單的,你可以使用 std:thread 來(lái)創(chuàng)建一個(gè)線程實(shí)例,創(chuàng)建完會(huì)自動(dòng)啟動(dòng),只需要給它傳遞一個(gè)要執(zhí)行函數(shù)的指針即可,請(qǐng)看下面這個(gè) Hello world 代碼:
#include <thread> #include <iostream> void hello(){ std::cout << "Hello from thread " << std::endl; } int main(){ std::thread t1(hello); t1.join(); return 0; }
所有跟線程相關(guān)的方法都在 thread 這個(gè)頭文件中定義,比較有意思的是我們?cè)谏厦娴拇a調(diào)用了 join() 函數(shù),其目的是強(qiáng)迫主線程等待線程執(zhí)行結(jié)束后才退出。如果你沒(méi)寫 join() 這行代碼,可能執(zhí)行的結(jié)果是打印了 Hello from thread 和一個(gè)新行,也可能沒(méi)有新行。因?yàn)橹骶€程可能在線程執(zhí)行完畢之前就返回了。
線程標(biāo)識(shí)
每個(gè)線程都有一個(gè)唯一的 ID 以識(shí)別不同的線程,std:thread 類有一個(gè) get_id() 方法返回對(duì)應(yīng)線程的唯一編號(hào),你可以通過(guò) std::this_thread 來(lái)訪問(wèn)當(dāng)前線程實(shí)例,下面的例子演示如何使用這個(gè) id:
#include <thread> #include <iostream> #include <vector> void hello(){ std::cout << "Hello from thread " << std::this_thread::get_id() << std::endl; } int main(){ std::vector<std::thread> threads; for(int i = 0; i < 5; ++i){ threads.push_back(std::thread(hello)); } for(auto& thread : threads){ thread.join(); } return 0; }
依次啟動(dòng)每個(gè)線程,然后把它們保存到一個(gè) vector 容器中,程序執(zhí)行結(jié)果是不可預(yù)測(cè)的,例如:
Hello from thread 140276650997504 Hello from thread 140276667782912 Hello from thread 140276659390208 Hello from thread 140276642604800 Hello from thread 140276676175616
也可能是:
Hello from thread Hello from thread Hello from thread 139810974787328Hello from thread 139810983180032Hello from thread 139810966394624 139810991572736 139810958001920
或者其他結(jié)果,因?yàn)槎鄠€(gè)線程的執(zhí)行是交錯(cuò)的。你完全沒(méi)有辦法去控制線程的執(zhí)行順序(否則那還要線程干嗎?)
當(dāng)線程要執(zhí)行的代碼就一點(diǎn)點(diǎn),你沒(méi)必要專門為之創(chuàng)建一個(gè)函數(shù),你可以使用 lambda 來(lái)定義要執(zhí)行的代碼,因此第一個(gè)例子我們可以改寫為:
#include <thread> #include <iostream> #include <vector> int main(){ std::vector<std::thread> threads; for(int i = 0; i < 5; ++i){ threads.push_back(std::thread([](){ std::cout << "Hello from thread " << std::this_thread::get_id() << std::endl; })); } for(auto& thread : threads){ thread.join(); } return 0; }
在這里我們使用了一個(gè) lambda 表達(dá)式替換函數(shù)指針,而結(jié)果是一樣的。
上一篇:C語(yǔ)言簡(jiǎn)單實(shí)現(xiàn)計(jì)算字符個(gè)數(shù)的方法
欄 目:C語(yǔ)言
下一篇:探究在C++程序并發(fā)時(shí)保護(hù)共享數(shù)據(jù)的問(wèn)題
本文標(biāo)題:C++程序中啟動(dòng)線程的方法
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/2975.html
您可能感興趣的文章
- 04-02func函數(shù)+在C語(yǔ)言 func函數(shù)在c語(yǔ)言中
- 04-02c語(yǔ)言中對(duì)數(shù)函數(shù)的表達(dá)式 c語(yǔ)言中對(duì)數(shù)怎么表達(dá)
- 04-02c語(yǔ)言沒(méi)有round函數(shù) round c語(yǔ)言
- 04-02C語(yǔ)言中怎么打出三角函數(shù) c語(yǔ)言中怎么打出三角函數(shù)的值
- 01-10使用OpenGL實(shí)現(xiàn)3D立體顯示的程序代碼
- 01-10深入理解C++中常見(jiàn)的關(guān)鍵字含義
- 01-10使用C++實(shí)現(xiàn)全排列算法的方法詳解
- 01-10深入Main函數(shù)中的參數(shù)argc,argv的使用詳解
- 01-10APUE筆記之:進(jìn)程環(huán)境詳解
- 01-10c++中inline的用法分析


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 04-02c語(yǔ)言函數(shù)調(diào)用后清空內(nèi)存 c語(yǔ)言調(diào)用
- 04-02func函數(shù)+在C語(yǔ)言 func函數(shù)在c語(yǔ)言中
- 04-02c語(yǔ)言的正則匹配函數(shù) c語(yǔ)言正則表達(dá)
- 04-02c語(yǔ)言用函數(shù)寫分段 用c語(yǔ)言表示分段
- 04-02c語(yǔ)言中對(duì)數(shù)函數(shù)的表達(dá)式 c語(yǔ)言中對(duì)
- 04-02c語(yǔ)言編寫函數(shù)冒泡排序 c語(yǔ)言冒泡排
- 04-02c語(yǔ)言沒(méi)有round函數(shù) round c語(yǔ)言
- 04-02c語(yǔ)言分段函數(shù)怎么求 用c語(yǔ)言求分段
- 04-02C語(yǔ)言中怎么打出三角函數(shù) c語(yǔ)言中怎
- 04-02c語(yǔ)言調(diào)用函數(shù)求fibo C語(yǔ)言調(diào)用函數(shù)求
隨機(jī)閱讀
- 01-11Mac OSX 打開(kāi)原生自帶讀寫NTFS功能(圖文
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 04-02jquery與jsp,用jquery
- 01-10delphi制作wav文件的方法
- 01-10SublimeText編譯C開(kāi)發(fā)環(huán)境設(shè)置
- 01-10C#中split用法實(shí)例總結(jié)
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?