`

读写锁SRWLock

 
阅读更多

 

       读写锁在对资源进行保护的同时,还能区分想要读取资源值的线程(读取者线程)和想要更新资源的线程(写入者线程)。

       对于读取者线程,读写锁会允许他们并发的执行。当有写入者线程在占有资源时,读写锁会让其它写入者线程和读取者线程等待。

       因此用读写锁来解决读者写者问题会使代码非常清晰和简洁。

 

       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.读取者和写入者分别调用不同的申请函数和释放函数。

 

  • 大小: 47.3 KB
  • 大小: 31.6 KB
  • 大小: 27.1 KB
  • 大小: 27.4 KB
  • 大小: 6.6 KB
分享到:
评论

相关推荐

    SRWLock读写锁模块.rar

    SRWLock,全称为“Slim Reader/Writer Lock”,是一种轻量级的读写锁机制,广泛应用于多线程编程中,以实现对共享资源的高效并发访问。在Windows系统中,SRWLock是内核级的同步原语,提供了一种优化的读写锁实现,比...

    易语言SRWLock读写锁模块源码

    SRWLock(Slim Reader/Writer Lock)是Windows操作系统中提供的一种线程同步机制,用于实现高效的读写锁。在多线程编程中,读写锁能够优化对共享资源的访问,允许多个线程同时读取资源,但在写入时确保只有一个线程...

    windows和linux读写锁C++实现

    Windows提供了一种称为SRWLock(Slim Reader/Writer Lock)的原生读写锁。下面是一个简单的C++实现示例: ```cpp #include class RWLock { private: SRWLOCK lock; public: RWLock() { InitializeSRWLock(&...

    windows 读写锁 (基于关键区的读写锁类 及自动锁)

    在Windows中,我们可以利用关键区(Critical Section)或者Slim Reader/Writer Lock(SRWLock)来实现读写锁。关键区是一种简单的同步原语,它保证同一时间只允许一个线程访问特定代码段。SRWLock提供了更高级的功能...

    易语言SRWLock读写锁模块

    易语言SRWLock读写锁模块源码,SRWLock读写锁模块,请求读锁,释放读锁,请求写锁,释放写锁,InitializeSRWLock,AcquireSRWLockExclusive,AcquireSRWLockShared,ReleaseSRWLockExclusive,ReleaseSRWLockShared

    易语言源码易语言SRWLock读写锁模块源码.rar

    《易语言SRWLock读写锁模块源码详解》 在计算机编程中,多线程同步是不可或缺的一部分,其中读写锁(SRWLock,即Slim Read-Write Lock)是一种高效的线程同步机制,尤其在高并发场景下,能够显著提升程序性能。...

    windows/linux读写锁简单改进版本

    在Windows系统中,我们可以使用`SRWLock`(Slim Reader/Writer Lock)API,这是一个轻量级的读写锁实现。`SRWLock`提供了`AcquireReader`、`AcquireWriter`、`ReleaseReader`和`ReleaseWriter`等函数,用于获取和...

    行业分类-设备装置-读写锁控制方法及装置.zip

    读写锁的实现通常依赖于操作系统提供的同步原语,如POSIX的pthread_rwlock系列函数或Windows的SRWLock。开发者需要根据具体平台和需求选择合适的实现方式,并正确地在代码中引入和管理读写锁,以确保并发安全。 在...

    易语言-易语言SRWLock读写锁模块

    SRWLock(Slim Read-Write Lock)是Windows操作系统中的一种轻量级读写锁,用于多线程环境下的并发控制。这种锁允许多个读取者同时访问共享资源,但只允许一个写入者独占资源,从而提高了程序的并行性能。 在易语言...

    RWLock:这是一个windows下的读写锁的实现,有win7原生支持的版本,也有xp的版本

    Windows API中的`SRWLock`(Slim Read-Write Lock)是Windows Vista之后引入的一个轻量级读写锁,适用于Win7及其后续版本。而在XP系统中,可能需要使用较早的`CRITICAL_SECTION`或自定义的互斥量(Mutex)实现,因为...

    易语言SRWLock读写锁模块源码-易语言

    在易语言中,SRWLock(单向读写锁)是一个重要的同步原语,用于管理对共享资源的并发访问。这种锁机制在多线程编程中扮演着关键角色,它能有效提高程序的执行效率和数据安全性。 SRWLock(Single-Reader-Writer ...

    条件变量和读写锁实现线程同步

    请求独占锁锁 AcquireSRWLockExclusive(&g_srwLock) 程序处于运行状态,并且数据已满:生产者转入休眠状态 SleepConditionVariableSRW(&g_cvReadyToProduce, &g_srwLock, INFINITE, 0); 程序停止工作:释放独占锁并且...

    读-写共享独占锁源码实现-C实现

    "读-写共享独占锁"(Read-Write Shared Exclusive Locks,简称读写锁)是一种优化多线程环境下数据访问效率的机制。在读写锁中,多个线程可以同时进行读操作,而写操作则是互斥的,即同一时间只有一个线程可以进行写...

    多读单写锁演示程序

    4. **多读单写锁API**:Windows API中的`ReentrantReadWriteLock`或`SRWLock`(Slim Reader/Writer Lock)就是一种实现读写锁的机制。`AcquireSRWLockShared`用于获取读锁,`AcquireSRWLockExclusive`用于获取写锁,...

    NT下未公开的多线程读,单线程写的函数

    因此,除非有特殊需求,一般建议使用操作系统提供的标准同步原语,如Windows API中的`SRWLock`(Slim Reader/Writer Lock),它是一个轻量级的读写锁,特别适合多核环境。 总之,多线程读写操作的同步是一个复杂的...

    ReadWriteLock

    读写锁(ReadWriteLock)是多线程编程中一种重要的同步机制,主要用于提高并发性能。在Windows环境下,C++可以通过自定义实现或者使用系统提供的API来创建读写锁。在这个项目中,`ReadWriteLock.cpp` 和 `...

    多线日志类读写操作

    在Windows操作系统中,我们可以使用`CreateMutex`或者`SRWLock` API来实现线程同步,以保护对日志文件的访问。 `stdafx.cpp`和`stdafx.h`通常包含了预编译头文件,它们可以加快编译速度,其中可能包含了标准库的...

    vc多线程

    在VC++中,`CreateEvent`可用于创建事件对象,`WaitForMultipleObjects`可以等待多个同步对象,`SRWLock`提供轻量级的读写锁。 最后,调试多线程程序也是一个挑战。VC++的调试器提供了线程窗口,可以查看和切换线程...

Global site tag (gtag.js) - Google Analytics