線程
std::thread類的構(gòu)造
std::thread可以用可調(diào)用類型(Callable)構(gòu)造。
Case 0 : 函數(shù)

Case 1 : 函數(shù)指針(Function Pointers)

Case 2 : lambda

Case 3 : 函數(shù)對象 (Function Objects)/ 仿函數(shù)(Functors)

分離線程(detaching)
使用detach()會讓線程在后臺運(yùn)行,意味著主線程不能與之產(chǎn)生直接交互。也就是說,不會等待這個(gè)線程結(jié)束。
試想如何能讓一個(gè)文字處理應(yīng)用同時(shí)編輯多個(gè)文檔。一種處理方式是,讓每個(gè)文檔處理窗口擁有自己的線程,打開一個(gè)文檔就啟動(dòng)一個(gè)新線程;每個(gè)線程運(yùn)行同樣的的代碼,并隔離不同窗口處理的數(shù)據(jù)。因?yàn)槭菍Κ?dú)立的文檔進(jìn)行操作,所以沒有必要等待其他線程完成。因此,可以讓文檔處理窗口運(yùn)行在分離的線程上。
使用分離線程處理多個(gè)文檔

線程所有權(quán)的轉(zhuǎn)移
線程對象代表一個(gè)執(zhí)行線程的實(shí)體,它通常與一個(gè)可調(diào)用對象相關(guān)聯(lián)。移動(dòng)線程對象并不會移動(dòng)正在執(zhí)行的線程本身,它只是移動(dòng)線程對象所擁有的底層資源。移動(dòng)線程對象后,原始線程對象將不再擁有與之關(guān)聯(lián)的線程資源。

首先,func與t1相關(guān)聯(lián)。當(dāng)顯式使用std::move()創(chuàng)建t2后,t1的所有權(quán)就轉(zhuǎn)移給
了t2。之后,t1和func就沒有關(guān)聯(lián)了。
下面定義了一個(gè)scoped_thread類,它可以確保線程在程序退出前完成。

創(chuàng)建一組線程
有時(shí)候一個(gè)工作可以拆分成若干個(gè)小任務(wù),每一個(gè)任務(wù)都由一個(gè)線程去做。這就需要?jiǎng)?chuàng)建一組線程,線程的數(shù)量應(yīng)該在運(yùn)行時(shí)確定。下面實(shí)現(xiàn)了一個(gè)并行版的std::accumulate,可以在多線程環(huán)境下加快累加的速度。

函數(shù)paraller_accumulate首先計(jì)算出需要啟動(dòng)的線程數(shù)量,然后將整個(gè)區(qū)間分成若干個(gè)塊,每個(gè)塊分配一個(gè)線程進(jìn)行累加,最后將每個(gè)塊的結(jié)果累加得到最終的結(jié)果。