1.互斥锁写入或者读取的时候都可以锁定。
2.互斥锁中的函数
- InitializeSRWLock
函数功能:初始化读写锁
函数原型:VOID InitializeSRWLock(PSRWLOCK SRWLock);
函数说明:初始化(没有删除或销毁SRWLOCK的函数,系统会自动清理)
- AcquireSRWLockExclusive
函数功能:写入者线程申请写资源。
函数原型:VOID AcquireSRWLockExclusive(PSRWLOCK SRWLock);
- 第三个 ReleaseSRWLockExclusive
函数功能:写入者线程写资源完毕,释放对资源的占用。
函数原型:VOID ReleaseSRWLockExclusive(PSRWLOCK SRWLock);
- 第四个 AcquireSRWLockShared
函数功能:读取者线程申请读资源。
函数原型:VOID AcquireSRWLockShared(PSRWLOCK SRWLock);
- 第五个 ReleaseSRWLockShared
函数功能:读取者线程结束读取资源,释放对资源的占用。
函数原型:VOID ReleaseSRWLockShared(PSRWLOCK SRWLock);
注意一个线程仅能锁定资源一次,不能多次锁定资源。
3.例子
例一:
#include <stdio.h> #include <stdlib.h> #include <Windows.h> int num = 6400000; SRWLOCK g_lock; //创建一个互斥锁的全局变量 // 注意一个线程仅能锁定资源一次,不能多次锁定资源 DWORD WINAPI read(void*p) { AcquireSRWLockShared(&g_lock);//读取期间,锁定数据,数据无法被修改 int i = 0; while (1) { Sleep(1000); printf(" 第%d秒num=%d",i, num); if (i==20) { break; } i++; } ReleaseSRWLockShared(&g_lock); } DWORD WINAPI go(void *p) { AcquireSRWLockExclusive(&g_lock);//锁定写入, printf(" 开始写入"); for (int i = 0; i < 100000; i++) { num--; //Sleep(10); } ReleaseSRWLockExclusive(&g_lock);// printf(" 结束写入"); } void main() { InitializeSRWLock(&g_lock);//初始化 CreateThread(NULL, 0, read, NULL, 0, NULL); HANDLE hd[64]; for (int i = 0; i < 64; i++) { hd[i] = CreateThread(NULL, 0, go, NULL, 0, NULL); } WaitForMultipleObjects(64, hd, TRUE, INFINITE); printf(" last=%d", num); system("pause"); }
例二 :
#include <stdio.h> #include <stdlib.h> #include <Windows.h> int num = 6400000; SRWLOCK g_lock; //改变一个变量的时候需要锁定 DWORD WINAPI go(void *p) { AcquireSRWLockExclusive(&g_lock);//锁定写入 for (int i = 0; i < 100000;i++) { num--; } ReleaseSRWLockExclusive(&g_lock);// } void main1() { InitializeSRWLock(&g_lock);//初始化 HANDLE hd[64]; for (int i = 0; i < 64;i++) { hd[i] = CreateThread(NULL, 0, go, NULL, 0, NULL); } WaitForMultipleObjects(64, hd, TRUE, INFINITE); printf("%d", num); system("pause"); }