C 11 多執行緒 執行緒管理基礎

2021-08-31 20:47:40 字數 4429 閱讀 2757

c++11 所有的執行緒都封裝在標頭檔案中,使用命名空間std說明。

最簡單的例子:

#include

#include

void

hello()

intmain()

每個執行緒都必須有乙個初始函式,新執行緒在函式中執行。join()的作用是等待執行緒執行完畢,然後向下執行。該例子中,如果沒有join,那麼可能出現主線程執行完畢,子執行緒還未完成,出現異常。

c++執行緒庫啟動執行緒可以歸結為構造乙個std::thread物件,使用可呼叫型別進行構造。傳入帶有函式呼叫符型別的引數例項,可以用來替代預設的建構函式。

joindetach的區別:

以下是構造執行緒的一般方法:

#include

#include

#include

#include

// 最普通方式

void

do_some_work()

// 函式物件方式

class

back_ground_task

void

do_something()

const

void

do_something_else()

const};

// 析構方保護執行緒

class

thread_guard

~thread_guard()

}thread_guard

(thread_guard const&)

=delete

; thread_guard&

operator

=(thread_guard const&)

=delete

;private

: std::thread& t;};

// 引數測試

void

arg_test

(int i,

const std::string& str)

// 類成員函式測試

classx}

;// 引用方式傳遞引數

void

ref_func_test

(std::string& str)

void

do_work

(int i)

void

create_epoch_threads

(int n)

// 對每個執行緒進行join操作

std::

for_each

(threads.

begin()

, threads.

end(),

std::

mem_fn

(&std::thread::join));

}int

main()

執行緒沒有拷貝操作!!!,所有權的轉移都是通過std::move實現的。這種型別的資源是不能直接賦值的,沒有意義,只能直接建立。

執行緒的所有權可以在函式外進行轉移。

std::thread f()

std::thread g()

編譯器有rov,不用擔心出現多餘的拷貝,這裡返回值就是相當於移動操作。

所有權可以在函式內部傳遞,同樣的也可以作為函式的引數,不過要使用std::move進行操作。

void

f(std::thread t)

;voidg(

)

可以使用類構造的方式,直接傳入執行緒,而不是各個引數。這樣,可以更加簡化操作。

#include

#include

void

do_something

(int i)

}struct func

void

operator()

()}}

;class

scoped_thread}~

scoped_thread()

scoped_thread

(scoped_thread const&)

=delete

; scoped_thread&

operator

=(scoped_thread const&)

=delete

;private

: std::thread t;};

voidf(

)int

main()

std::thread::hardware_concurrency()函式返回cpu核心的數量或者是乙個程式中最多能同時併發的函式數量。

給出乙個多執行緒版本的std::accumulate函式。

#include

#include

#include

#include

#include

template

<

typename iterator,

typename t>

struct accumulate_block };

template

<

typename iterator,

typename t>

t parallel_accumulate

(iterator first, iterator last, t init)

// 計算可能的剩餘量,並等待所有執行緒結束

accumulate_block()

(block_start, last, results[num_threads -1]

);std::

for_each

(threads.

begin()

, threads.

end(),

std::

mem_fn

(&std::thread::join));

// 每個執行緒計算的結果進行彙總

return std::

accumulate

(results.

begin()

, results.

end(

), init);}

intmain()

using iter = std::vector

::iterator;

// 並行化計算

auto start =

clock()

; std::cout << parallel_accumulateint>

(vec.

begin()

, vec.

end(

), init)

<< std::endl;

auto stop =

clock()

; std::cout <<

"time="

<< stop - start << std::endl;

// 序列計算

start =

clock()

; std::cout << std::

accumulate

(vec.

begin()

, vec.

end(

), init)

<< std::endl;

stop =

clock()

; std::cout <<

"time="

<< stop - start << std::endl;

return0;

}/*輸出結果:

200000000

time=469

200000000

time=1924

執行環境:intel i7 4710mq,四核

時間差不多是4倍

*/

補充:std::accumulate()是累加函式,std::advance()是迭代器移動函式,必須是前向或者雙向迭代器才可以。

注意:不能從執行緒中直接返回乙個值,在這裡採取引用的方式進行解決。

c++中,執行緒的識別符號型別是std::thread::id。使用std::threadget_id()成員直接獲取。一般來說,這種方式是用來對執行緒進行檢測的,以判斷是否需要進行有關的操作。

C 11 多執行緒

新特性之描述 雖然 c 11 會在語言的定義上提供乙個記憶體模型以支援執行緒,但執行緒的使用主要將以 c 11 標準庫的方式呈現。c 11 標準庫會提供型別 thread std thread 若要執行乙個執行緒,可以建立乙個型別 thread 的實體,其初始引數為乙個函式物件,以及該函式物件所需要...

c 11 多執行緒

1.多執行緒的原理 同一時間內,cpu只能處理1條執行緒,只有1條執行緒在工作 執行 多執行緒併發 同時 執行,其實是cpu快速地在多條執行緒之間排程 切換 如果cpu排程執行緒的時間足夠快,就造成了多執行緒併發執行的假象。思考 如果執行緒非常非常多,會發生什麼情況?cpu會在n多執行緒之間排程,c...

C 11 多執行緒

2011 年 c 迎來重大的改革 語言層面上承認了 多執行緒 程式的存在 加入了 thread 多執行緒支援庫,內容豐富 功能強大。首先從我個人理解角度粗鄙的理解一下多執行緒。多執行緒眾所周知 切割時間片的多程式併發執行,大多數的計算機都支援多執行緒併發的硬體支援。這可能是最簡單的多執行緒程式了。多...