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

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

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

  

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的更多相关文章

  1. 读者写者问题继 读写锁SRWLock

    在<秒杀多线程第十一篇读者写者问题>文章中我们使用事件和一个记录读者个数的变量来解决读者写者问题.问题虽然得到了解决,但代码有点复杂.本篇将介绍一种新方法--读写锁SRWLock来解决这一 ...

  2. 多线程面试题系列(14):读者写者问题继 读写锁SRWLock

    在第十一篇文章中我们使用事件和一个记录读者个数的变量来解决读者写者问题.问题虽然得到了解决,但代码有点复杂.本篇将介绍一种新方法--读写锁SRWLock来解决这一问题.读写锁在对资源进行保护的同时,还 ...

  3. 转---秒杀多线程第十四篇 读者写者问题继 读写锁SRWLock

    在<秒杀多线程第十一篇读者写者问题>文章中我们使用事件和一个记录读者个数的变量来解决读者写者问题.问题虽然得到了解决,但代码有点复杂.本篇将介绍一种新方法——读写锁SRWLock来解决这一 ...

  4. 多线程 读写锁SRWLock

    在<秒杀多线程第十一篇读者写者问题>文章中我们使用事件和一个记录读者个数的变量来解决读者写者问题.问题虽然得到了解决,但代码有点复杂.本篇将介绍一种新方法——读写锁SRWLock来解决这一 ...

  5. 秒杀多线程第十四篇 读者写者问题继 读写锁SRWLock (续)

    java 包实现了读写锁的操作: package com.multithread.readwritelock; import java.util.concurrent.CountDownLatch; ...

  6. 最新Windows下c++读写锁SRWLock介绍

    https://blog.csdn.net/MoreWindows/article/details/7650574 https://blog.csdn.net/chenzhjlf/article/de ...

  7. WINDOWS 同步(Interlocked,InterlockedExchangeAdd,Slim读/写锁,WaitForSingleObject,CreateWaitableTimer等等)

    NOTE0 在以下两种基本情况下,线程之间需要相互通信: 需要让多个线程同时访问一个共享资源,同时不能破坏资源的完整性: 一个线程需要通知其它线程某项任务已经完成 1.原子访问:Interlocked ...

  8. sqlite3 读写锁

    转载:https://blog.csdn.net/u012218838/article/details/79362929(sqlite3 使用读写锁SRWLOCK例子) 转载:https://my.o ...

  9. 第8章 用户模式下的线程同步(3)_Slim读写锁(SRWLock)

    8.5 Slim读/写锁(SRWLock)——轻量级的读写锁 (1)SRWLock锁的目的 ①允许读者线程同一时刻访问共享资源(因为不存在破坏数据的风险) ②写者线程应独占资源的访问权,任何其他线程( ...

随机推荐

  1. Windows Live Wirter

    安装: 下载: Windows Live Writer (QQ 里) windows live writer 日志服务器发生问题 更新账户信息 从字面"editPost"我们不难看 ...

  2. php字符串的拆分截取

    /* * strstr区分大小写 * stristr不区分大小写 * */ $str="test/abc.jpg"; echo stristr($str,'.'); echo '& ...

  3. 树上第k大联通块

    题意:求树上第k大联通块 n,k<=1e5 考虑转化为k短路的形式. 也就是要建出一张图是的这条图上每一条S到T的路径都能代表一个联通块. 点分治建图 递归下去,假定每个子树的所有联通块中都可以 ...

  4. 机器学习 之k-means和DBSCAN的区别

    目录 1.定义和区别(优缺点对比) 2.kmeans原理 3.DBSCAN原理 1.定义和区别(优缺点对比) 聚类分为:基于划分.层次.密度.图形和模型五大类: 均值聚类k-means是基于划分的聚类 ...

  5. 基于VMware模拟实现远程主机网络通信

    基于VMware模拟实现远程主机网络通信 目的: 基于VMware软件,模拟实现不同网段的两主机,通过路由器进行通信.两主机host A和host B分别处于VMnet6网络和VMnet7网络,都属于 ...

  6. 『MXNet』第五弹_MXNet.image图像处理

    简单处理API 读取图像: image.imdecode(open('../img/cat1.jpg', 'rb').read()) 图像类型转换: img.astype('float32') 图像增 ...

  7. 自定义alert弹框,title不显示域名

    问题: 系统默认的alert弹框的title会默认显示网页域名 解决办法: (修改弹框样式) (function() { window.alert = function(name) { $(" ...

  8. RabbitMQ、Redis、Memcache

    Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度 ...

  9. Hadoop---hu-hadoop1: mv: cannot stat `/home/bigdata/hadoop-2.6.0/logs/hadoop-root-datanode-hu-hadoop1.out.4': No such file or directory

    hu-hadoop1: mv: cannot stat `/home/bigdata/hadoop-2.6.0/logs/hadoop-root-datanode-hu-hadoop1.out.4': ...

  10. java高级---->Serializable的过程分析

    本次讲解中我们在上次的基础上,深入的了解一下序列化的流程以及其中的原理.关于序列化的一些知识与使用,请参见我的另一篇博客:java基础---->Serializable的使用.好了,我们进行以下 ...