本文是對c++11 多執行緒程式設計(一 ~ 三)
的補充
api說明
yield
讓出處理器,重新排程各執行執行緒
get_id
返回當前執行緒的執行緒 id
sleep_for
使當前執行緒暫停指定的時間段
sleep_until
使當前執行緒暫停直到指定的時間點
後面三個比較容易理解,比如
std::this_thread::
sleep_for
( chrono::
seconds(3
));//當前執行緒的執行停止指定的時間段
std::this_thread::
get_id()
;//返回此執行緒的id
現在主要討論yield 的使用: 當前執行緒暫時放棄執行,作業系統排程另一線程繼續執行。
比如說你的執行緒需要等待某個操作完成,如果你直接用乙個迴圈不斷判斷這個操作是否完成就會使得這個執行緒佔滿cpu時間,這會造成資源浪費。這時候你可以判斷一次操作是否完成,如果沒有完成就呼叫yield交出時間片,過一會兒
再來判斷是否完成,這樣這個執行緒占用cpu時間會大大減少。
#include
"stdafx.h"
#include
#include
#include
#include
#include
std::mutex g_mutex;
std::atomic<
bool
>
ready
(false);
void
count1m
(int id)
for(
int i =
0; i <
1000000
;++i)
std::lock_guard<:mutex>
lock
(g_mutex)
; std::cout <<
"thread : "
<< id << std::endl;
}int
main()
ready =
true
;// go!
for(
auto
& th : threads)
std::cout <<
'\n'
;return0;
}
輸出結果:
在一些情況下,我們有些任務需要執行一次,並且我們只希望它執行一次,例如資源的初始化任務。也就是要保證,即便在多執行緒的環境下,相應的函式也只會呼叫一次
。c++提供了call_once
和once_flag
完成這個任務。
下面就是乙個示例:有三個執行緒都會使用init
函式,但是只會有乙個線**正執行它。
void
init()
void
worker
(once_flag* flag)
intmain()
我們無法確定具體是哪乙個執行緒會執行init。而事實上,我們也不關心,因為只要有某個執行緒完成這個初始化工作就可以了。
(待續~)
參考:c++併發程式設計
C 多執行緒程式設計之四
例程4 multithread4 該例程測試在windows下最多可建立執行緒的數目。建立乙個基於對話方塊的工程multithread4,在對話方塊idd multithread4 dialog中加入乙個按鈕idc test和乙個編輯框idc count,按鈕標題為 測試 編輯框屬性選中read o...
多執行緒程式設計(四)
多執行緒的服務端 server pragma comment lib,ws2 32.lib include include includeusing namespace std 處理服務 unsigned stdcall do service void p while 1 if ret 0 if r...
多執行緒補充
標籤 空格分隔 多執行緒 pragma mark 延遲執行 void delay pragma mark 只執行一次 void once pragma mark 快速迭代 獲取 資料夾路徑和目的資料夾路徑 nsstring source users v desktop source nsstring...