srwlock的目的和關鍵段一樣,但不同的是srwlock可以區分哪些執行緒要讀取共享資源,哪些要更新共享資源。讀取共享資源的執行緒因為不會破壞共享資源的資料,故這些執行緒可以同時讀取同一共享資源,但要更新共享資源的執行緒必須獨佔共享資源,此時讀取執行緒也沒有許可權訪問共享資源。
更新執行緒:
1.定義乙個srwlock結構,並用initializesrwlock函式對它進行初始化:
void initializesrwlock(psrwlock srwlock);
2.初始化後,寫入者執行緒可以呼叫acquiresrwlockexclusive,嘗試獲得被保護資源的獨占權:
void acquiresrwlockexclusive(psrwlock srwlock);
3.完成對資源的更新後,解除對資源的鎖定
void releasesrwlockexclusive(psrwlock srwlock);
讀取執行緒
和讀取執行緒基本類似,除了以下倆個函式
void acquiresrwlockshared(psrwlock srwlock);
void releasesrwlockshared(psrwlock srwlock);
srwlock不用刪除或銷毀,系統會自動執行清理工作。
#include "stdafx.h"
#include
#include
#include
using
namespace
std;
int g_x = 0;
srwlock g_srwlock;
uint winapi writethreadfunc1(pvoid parguments)
releasesrwlockexclusive(&g_srwlock);
_endthreadex(0);
return0;}
uint winapi writethreadfunc2(pvoid parguments)
releasesrwlockexclusive(&g_srwlock);
_endthreadex(0);
return0;}
uint winapi readthreadfunc1(pvoid parguments)
uint winapi readthreadfunc2(pvoid parguments)
int _tmain(int argc, _tchar* argv)
輸出結果有時是這樣的:
writethreadfunc1..
writethreadfunc1..
writethreadfunc1..
writethreadfunc2..
writethreadfunc2..
writethreadfunc2..
writethreadfunc2..
writethreadfunc2..
readthreadfunc1..readthreadfunc2..
寫執行緒的輸出很好理解,因為他們獨佔資源,所以寫執行緒不可能併發執行,而是乙個乙個執行的。
那有人問了我的輸出不是這樣啊?也有可能是下面三種情況
readthreadfunc2..readthreadfunc1..
readthreadfunc1..
readthreadfunc2..
readthreadfunc2..
readthreadfunc1..
其實很好理解,讀執行緒可以在同一時刻訪問共享資源。所以當寫執行緒執行完後,倆個讀執行緒同時結束等待狀態,變成是可排程狀態,系統可能會先執行readthreadfunc1,然後在執行readthreadfunc2,或者反之,這樣就出現了下面倆種輸出結果:
readthreadfunc1..
readthreadfunc2..
readthreadfunc2..
readthreadfunc1..
也有可能readthreadfunc1執行到cout << 「readthreadfunc1..」到這步, 然後readthreadfunc1被暫停,系統切換到readthreadfunc2(readthreadfunc1和readthreadfunc2順序可調換)。這樣就出現了下面倆種輸出結果:
readthreadfunc1..readthreadfunc2..
readthreadfunc2..readthreadfunc1..
ubuntu下C的多執行緒的執行緒同步
為什麼需要執行緒同步 因為在多執行緒環境中,執行緒之間由於競爭共享資源 臨界資源 容易引起資料不一致的問題。一般採用互斥鎖 互斥訊號量 解決,保證只有乙個執行緒進入臨界區。這篇文章就講互斥鎖,讀寫鎖 互斥量 mutex 主要用於保護共享資料,確保同一時間只有乙個執行緒訪問資料。互斥量從本質上來說是一...
windows下的執行緒同步的方式
臨界區 互斥區 事件 訊號量四種方式 臨界區 critical section 互斥量 mutex 訊號量 semaphore 事件 event 的區別 1 臨界區 通過對多執行緒的序列化來訪問公共資源或一段 速度快,適合控制資料訪問。在任意時刻只允許乙個執行緒對共享資源進行訪問,如果有多個執行緒試...
利用策略模式實現的執行緒同步
利用策略模式實現的執行緒同步 標頭檔案 ifndef mutex demo define mutex demo include 鎖介面類 class ilock virtual void lock 0 virtual void unlock 0 互斥型的鎖 class mutexlock publi...