读写锁 SRWLOCK
生活随笔
收集整理的這篇文章主要介紹了
读写锁 SRWLOCK
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
讀寫鎖在對資源進行保護的同時,還能區分想要讀取資源值的線程(讀取者線程)和想要更新資源的線程(寫入者線程)。
對于讀取者線程,讀寫鎖會允許他們并發的執行。當有寫入者線程在占有資源時,讀寫鎖會讓其它寫入者線程和讀取者線程等待。
用讀寫鎖來解決讀者寫者問題會使代碼非常清晰和簡潔。
typedef RTL_SRWLOCK SRWLOCK, *PSRWLOCK;
typedef struct _RTL_SRWLOCK {
PVOID Ptr;
} RTL_SRWLOCK, *PRTL_SRWLOCK; // 初始化讀寫鎖
WINBASEAPI
VOID
WINAPI
InitializeSRWLock (
__out PSRWLOCK SRWLock
); // 獨占式訪問
WINBASEAPI
VOID
WINAPI
AcquireSRWLockExclusive (
__inout PSRWLOCK SRWLock
); // 共享式訪問
WINBASEAPI
VOID
WINAPI
AcquireSRWLockShared (
__inout PSRWLOCK SRWLock
); // 獨占式釋放
WINBASEAPI
VOID
WINAPI
ReleaseSRWLockExclusive (
__inout PSRWLOCK SRWLock
); // 共享式釋放
WINBASEAPI
VOID
WINAPI
ReleaseSRWLockShared (
__inout PSRWLOCK SRWLock
);
// SRWLock.cpp : 定義控制臺應用程序的入口點。
// #include "stdafx.h"
#include <iostream>
#include <windows.h>
#include <process.h> using namespace std;
unsigned int __stdcall ReadThread(PVOID ParameterData);
unsigned int __stdcall WriteThread(PVOID ParameterData); const int NUM = 30, READER_SIZE = 10;
HANDLE ThreadRead[NUM], ThreadWrite[NUM];
SRWLOCK __SRWLock; int main()
{
InitializeSRWLock(&__SRWLock); int i = 0;
for (; i<NUM; i++) {
ThreadRead[i] = (HANDLE)_beginthreadex(NULL, 0, ReadThread, NULL, 0, NULL);
ThreadWrite[i] = (HANDLE)_beginthreadex(NULL, 0, WriteThread, NULL, 0, NULL);
} WaitForMultipleObjects(NUM, ThreadRead, TRUE, INFINITE);
WaitForMultipleObjects(NUM, ThreadWrite, TRUE, INFINITE); cout << "運行完畢" << endl;
getchar();
return 0;
} unsigned int __stdcall ReadThread(PVOID ParameterData) {
AcquireSRWLockShared(&__SRWLock); cout << "ID" << GetCurrentThreadId() << " Read Thread Begin!" << endl;
Sleep(100);
cout << "ID" << GetCurrentThreadId() << " Read Thread Terminate!" << endl; ReleaseSRWLockShared(&__SRWLock);
return 0;
} unsigned int __stdcall WriteThread(PVOID ParameterData) {
AcquireSRWLockExclusive(&__SRWLock);
cout << "ID" << GetCurrentThreadId() << " WRITE Thread Begin~~~~~~~~~~" << endl;
Sleep(200);
cout << "ID" << GetCurrentThreadId() << " WRITE Thread Terminate~~~~~~" << endl;
ReleaseSRWLockExclusive(&__SRWLock);
return 0;
}
總結
以上是生活随笔為你收集整理的读写锁 SRWLOCK的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CentOS7 实战源码安装mysql5
- 下一篇: socket INADDR_ANY