c 多執行緒程式設計 四 補充

2021-10-01 18:31:44 字數 1817 閱讀 6556

本文是對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_onceonce_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...