使用者模式下的執行緒同步 Slim讀 寫鎖

2021-08-05 21:29:49 字數 2452 閱讀 9945

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...