條件變數是利用執行緒間共享的全域性變數進行同步的一種機制,主要包括兩個動作:乙個執行緒等待 「條件變數的條件成立」 而掛起;另乙個執行緒使 「條件成立」,然後喚醒另乙個等待執行緒。
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 臨界區 通過對多執行緒的序列化來訪問公共資源或一段 速度快,適合控制資料訪問。在任意時刻只允許乙個執行緒對共享資源進行...