windows程式設計執行緒同步之條件變數

2021-10-08 00:00:48 字數 2425 閱讀 2454

條件變數是利用執行緒間共享的全域性變數進行同步的一種機制,主要包括兩個動作:乙個執行緒等待 「條件變數的條件成立」 而掛起;另乙個執行緒使 「條件成立」,然後喚醒另乙個等待執行緒。

c++11提供了多執行緒執行緒同步的條件變數介面可以呼叫,一般都需要配合互斥量進行使用,常說到的生產者-消費者模型就可以用條件變數進行實現。

主要用到的結果介面有:

void

wait

(std::unique_lock<:mutex>

& lock)

;//predicate 謂詞函式,第二個引數可為lambda表示式或函式

template

<

class

predicate

>

void

wait

(std::unique_lock<:mutex>

& lock, predicate pred)

;template

<

class

rep,

class

period

>

std::cv_status wait_for

( std::unique_lock<:mutex>

& lock,

const std::chrono::duration

& rel_time)

;template

<

class

rep,

class

period

,class

predicate

>

bool

wait_for

( std::unique_lock<:mutex>

& lock,

const std::chrono::duration

& rel_time,

predicate pred)

;void

notify_one()

noexcept

;喚醒等待執行緒其中乙個。

void

notify_all()

noexcept

;喚醒全部等待執行緒。

接下來給乙個例子,有3個執行緒,1個執行緒「生產訊息」,另外兩個執行緒「等待喚醒」,當訊息佇列中有訊息的時候,喚醒另外兩個執行緒去拿訊息。當訊息佇列中無訊息時,另外兩個執行緒掛起,「生產」執行緒開始生產訊息。

#include

#include

#include

#include

#include

using

namespace std;

class

areturn;}

void

outmsgrecvqueue()

return

false;}

);//此時處於鎖狀態,訊息佇列中至少有1條資料

printf

("從訊息佇列中取出: %d, 執行緒id: %d\n"

, msgrecvqueue.

front()

, this_thread::

get_id()

);msgrecvqueue.

pop_front()

; sbguardl.

unlock()

;//拿完資料,記得解鎖

//下面可以對資料做一些處理......}}

void

outmsgrecvqueue1()

return

false;}

);//此時處於鎖狀態,訊息佇列中至少有1條資料

printf

("從訊息佇列中取出: %d, 執行緒id: %d\n"

, msgrecvqueue.

front()

, this_thread::

get_id()

);msgrecvqueue.

pop_front()

; sbguardl.

unlock()

;//拿完資料,記得解鎖

//下面可以對資料做一些處理......}}

private

: list<

int> msgrecvqueue;

mutex my_mutexl;

condition_variable my_cond;};

intmain

(int argc,

char

const

*ar**)

結果(執行緒id = 2的為「生產者」,執行緒id = 3和執行緒id = 4的為「消費者」):

Windows執行緒同步

以下內容摘抄自 visual c 開發技術大全 為學習筆記。執行緒同步的方法有很多,最常用的有 互斥 cmutex 臨界 criticalsection 訊號量 semaphore 事件 event 等。這4種方式分別在 win32 和 mfc 兩種方式下各有一種實現,mfc 方式是對 win32方...

Windows執行緒同步

多執行緒程式中,多個執行緒在申請唯一份資源時,存在乙個隱患那就是重複使用。舉乙個例子,火車售票系統,一共100張票,用兩個執行緒來模擬售票。dword winapi fun1proc lpvoid lpparameter dword winapi fun1proc lpvoid lpparamete...

Windows執行緒同步之互斥鎖(Mutex)

執行緒同步的方式和機制 臨界區 互斥區 事件 訊號量四種方式 臨界區 critical section 互斥量 mutex 訊號量 semaphore 事件 event 的區別 1 臨界區 通過對多執行緒的序列化來訪問公共資源或一段 速度快,適合控制資料訪問。在任意時刻只允許乙個執行緒對共享資源進行...