读写锁在对资源进行保护的同时,还能区分想要读取资源值的线程(读取者线程)和想要更新资源的线程(写入者线程)。
对于读取者线程,读写锁会允许他们并发的执行。当有写入者线程在占有资源时,读写锁会让其它写入者线程和读取者线程等待。
因此用读写锁来解决读者写者问题会使代码非常清晰和简洁。
SRWLock 允许我们区分那些想要读取资源的值的线程(读取者线程)和想要更新资源值的线程(写入者线程)
所有的读取者线程在同一时刻访问共享资源是可以的,这是因为仅仅读取资源的值并不存在破坏数据的风险。
只有当写入者线程想要对资源进行更新的时候才需要同步。
在这种情况下,写入者线程应该独占对资源的访问权: 任何其他线程,无论是读取者线程还是写入者线程,都不允许访问资源。
相关函数介绍:
第一个 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);
注意一个线程仅能锁定资源一次,不能多次锁定资源。
实例代码如下:
#include <iostream> #include <windows.h> #include <process.h> using namespace std; const int NUM = 30, READER_SIZE = 10; HANDLE thread_r[NUM], thread_o[NUM], thread_w[NUM]; CRITICAL_SECTION sc, oc; SRWLOCK rwLock; unsigned int __stdcall read(PVOID pm) { AcquireSRWLockShared(&rwLock); EnterCriticalSection(&sc); cout << GetCurrentThreadId() << "号,读进程开始..." << endl; LeaveCriticalSection(&sc); Sleep(rand() % 100); EnterCriticalSection(&sc); cout << GetCurrentThreadId() << "号,读进程结束..." << endl; LeaveCriticalSection(&sc); ReleaseSRWLockShared(&rwLock); return 0; } unsigned int __stdcall write(PVOID pm) { AcquireSRWLockExclusive(&rwLock); cout << GetCurrentThreadId() << "号,--------------写进程开始..." << endl; Sleep(rand() % 100); cout << GetCurrentThreadId() << "号,--------------写进程执行完毕..." << endl; ReleaseSRWLockExclusive(&rwLock); return 0; } int main() { InitializeCriticalSection(&sc); InitializeCriticalSection(&oc); InitializeSRWLock(&rwLock); int i = 0; for(; i<NUM; i++) { thread_r[i] = (HANDLE) _beginthreadex(NULL, 0, read, NULL, 0, NULL); thread_w[i] = (HANDLE) _beginthreadex(NULL, 0, write, NULL, 0, NULL); } WaitForMultipleObjects(NUM, thread_r, TRUE, INFINITE); // Sleep(100); // 在执行30个 读线程 for(i=0; i<NUM; i++) { thread_o[i] = (HANDLE) _beginthreadex(NULL, 0, read, NULL, 0, NULL); } // writeLock = true; WaitForMultipleObjects(NUM, thread_w, TRUE, INFINITE); WaitForMultipleObjects(NUM, thread_o, TRUE, INFINITE); DeleteCriticalSection(&sc); DeleteCriticalSection(&oc); cout << "运行完毕" << endl; getchar(); return 0; }
运行效果如下:
总结一下读写锁SRWLock
1.读写锁声明后要初始化,但不用销毁,系统会自动清理读写锁。
2.读取者和写入者分别调用不同的申请函数和释放函数。
相关推荐
SRWLock,全称为“Slim Reader/Writer Lock”,是一种轻量级的读写锁机制,广泛应用于多线程编程中,以实现对共享资源的高效并发访问。在Windows系统中,SRWLock是内核级的同步原语,提供了一种优化的读写锁实现,比...
SRWLock(Slim Reader/Writer Lock)是Windows操作系统中提供的一种线程同步机制,用于实现高效的读写锁。在多线程编程中,读写锁能够优化对共享资源的访问,允许多个线程同时读取资源,但在写入时确保只有一个线程...
Windows提供了一种称为SRWLock(Slim Reader/Writer Lock)的原生读写锁。下面是一个简单的C++实现示例: ```cpp #include class RWLock { private: SRWLOCK lock; public: RWLock() { InitializeSRWLock(&...
在Windows中,我们可以利用关键区(Critical Section)或者Slim Reader/Writer Lock(SRWLock)来实现读写锁。关键区是一种简单的同步原语,它保证同一时间只允许一个线程访问特定代码段。SRWLock提供了更高级的功能...
易语言SRWLock读写锁模块源码,SRWLock读写锁模块,请求读锁,释放读锁,请求写锁,释放写锁,InitializeSRWLock,AcquireSRWLockExclusive,AcquireSRWLockShared,ReleaseSRWLockExclusive,ReleaseSRWLockShared
《易语言SRWLock读写锁模块源码详解》 在计算机编程中,多线程同步是不可或缺的一部分,其中读写锁(SRWLock,即Slim Read-Write Lock)是一种高效的线程同步机制,尤其在高并发场景下,能够显著提升程序性能。...
在Windows系统中,我们可以使用`SRWLock`(Slim Reader/Writer Lock)API,这是一个轻量级的读写锁实现。`SRWLock`提供了`AcquireReader`、`AcquireWriter`、`ReleaseReader`和`ReleaseWriter`等函数,用于获取和...
读写锁的实现通常依赖于操作系统提供的同步原语,如POSIX的pthread_rwlock系列函数或Windows的SRWLock。开发者需要根据具体平台和需求选择合适的实现方式,并正确地在代码中引入和管理读写锁,以确保并发安全。 在...
SRWLock(Slim Read-Write Lock)是Windows操作系统中的一种轻量级读写锁,用于多线程环境下的并发控制。这种锁允许多个读取者同时访问共享资源,但只允许一个写入者独占资源,从而提高了程序的并行性能。 在易语言...
Windows API中的`SRWLock`(Slim Read-Write Lock)是Windows Vista之后引入的一个轻量级读写锁,适用于Win7及其后续版本。而在XP系统中,可能需要使用较早的`CRITICAL_SECTION`或自定义的互斥量(Mutex)实现,因为...
在易语言中,SRWLock(单向读写锁)是一个重要的同步原语,用于管理对共享资源的并发访问。这种锁机制在多线程编程中扮演着关键角色,它能有效提高程序的执行效率和数据安全性。 SRWLock(Single-Reader-Writer ...
请求独占锁锁 AcquireSRWLockExclusive(&g_srwLock) 程序处于运行状态,并且数据已满:生产者转入休眠状态 SleepConditionVariableSRW(&g_cvReadyToProduce, &g_srwLock, INFINITE, 0); 程序停止工作:释放独占锁并且...
"读-写共享独占锁"(Read-Write Shared Exclusive Locks,简称读写锁)是一种优化多线程环境下数据访问效率的机制。在读写锁中,多个线程可以同时进行读操作,而写操作则是互斥的,即同一时间只有一个线程可以进行写...
4. **多读单写锁API**:Windows API中的`ReentrantReadWriteLock`或`SRWLock`(Slim Reader/Writer Lock)就是一种实现读写锁的机制。`AcquireSRWLockShared`用于获取读锁,`AcquireSRWLockExclusive`用于获取写锁,...
因此,除非有特殊需求,一般建议使用操作系统提供的标准同步原语,如Windows API中的`SRWLock`(Slim Reader/Writer Lock),它是一个轻量级的读写锁,特别适合多核环境。 总之,多线程读写操作的同步是一个复杂的...
读写锁(ReadWriteLock)是多线程编程中一种重要的同步机制,主要用于提高并发性能。在Windows环境下,C++可以通过自定义实现或者使用系统提供的API来创建读写锁。在这个项目中,`ReadWriteLock.cpp` 和 `...
在Windows操作系统中,我们可以使用`CreateMutex`或者`SRWLock` API来实现线程同步,以保护对日志文件的访问。 `stdafx.cpp`和`stdafx.h`通常包含了预编译头文件,它们可以加快编译速度,其中可能包含了标准库的...
在VC++中,`CreateEvent`可用于创建事件对象,`WaitForMultipleObjects`可以等待多个同步对象,`SRWLock`提供轻量级的读写锁。 最后,调试多线程程序也是一个挑战。VC++的调试器提供了线程窗口,可以查看和切换线程...