c++11 所有的執行緒都封裝在標頭檔案中,使用命名空間
std
說明。
最簡單的例子:
#include
#include
void
hello()
intmain()
每個執行緒都必須有乙個初始函式,新執行緒在函式中執行。join()
的作用是等待執行緒執行完畢,然後向下執行。該例子中,如果沒有join
,那麼可能出現主線程執行完畢,子執行緒還未完成,出現異常。
c++執行緒庫啟動執行緒可以歸結為構造乙個std::thread
物件,使用可呼叫型別進行構造。傳入帶有函式呼叫符型別的引數例項,可以用來替代預設的建構函式。
join
和detach
的區別:
以下是構造執行緒的一般方法:
#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::thread
的get_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 多執行緒支援庫,內容豐富 功能強大。首先從我個人理解角度粗鄙的理解一下多執行緒。多執行緒眾所周知 切割時間片的多程式併發執行,大多數的計算機都支援多執行緒併發的硬體支援。這可能是最簡單的多執行緒程式了。多...