读写锁 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的更多相关文章
- 读者写者问题继 读写锁SRWLock
在<秒杀多线程第十一篇读者写者问题>文章中我们使用事件和一个记录读者个数的变量来解决读者写者问题.问题虽然得到了解决,但代码有点复杂.本篇将介绍一种新方法--读写锁SRWLock来解决这一 ...
- 多线程面试题系列(14):读者写者问题继 读写锁SRWLock
在第十一篇文章中我们使用事件和一个记录读者个数的变量来解决读者写者问题.问题虽然得到了解决,但代码有点复杂.本篇将介绍一种新方法--读写锁SRWLock来解决这一问题.读写锁在对资源进行保护的同时,还 ...
- 转---秒杀多线程第十四篇 读者写者问题继 读写锁SRWLock
在<秒杀多线程第十一篇读者写者问题>文章中我们使用事件和一个记录读者个数的变量来解决读者写者问题.问题虽然得到了解决,但代码有点复杂.本篇将介绍一种新方法——读写锁SRWLock来解决这一 ...
- 多线程 读写锁SRWLock
在<秒杀多线程第十一篇读者写者问题>文章中我们使用事件和一个记录读者个数的变量来解决读者写者问题.问题虽然得到了解决,但代码有点复杂.本篇将介绍一种新方法——读写锁SRWLock来解决这一 ...
- 秒杀多线程第十四篇 读者写者问题继 读写锁SRWLock (续)
java 包实现了读写锁的操作: package com.multithread.readwritelock; import java.util.concurrent.CountDownLatch; ...
- 最新Windows下c++读写锁SRWLock介绍
https://blog.csdn.net/MoreWindows/article/details/7650574 https://blog.csdn.net/chenzhjlf/article/de ...
- WINDOWS 同步(Interlocked,InterlockedExchangeAdd,Slim读/写锁,WaitForSingleObject,CreateWaitableTimer等等)
NOTE0 在以下两种基本情况下,线程之间需要相互通信: 需要让多个线程同时访问一个共享资源,同时不能破坏资源的完整性: 一个线程需要通知其它线程某项任务已经完成 1.原子访问:Interlocked ...
- sqlite3 读写锁
转载:https://blog.csdn.net/u012218838/article/details/79362929(sqlite3 使用读写锁SRWLOCK例子) 转载:https://my.o ...
- 第8章 用户模式下的线程同步(3)_Slim读写锁(SRWLock)
8.5 Slim读/写锁(SRWLock)——轻量级的读写锁 (1)SRWLock锁的目的 ①允许读者线程同一时刻访问共享资源(因为不存在破坏数据的风险) ②写者线程应独占资源的访问权,任何其他线程( ...
随机推荐
- 2017-09-21xlVBA_蒸发SQL循环查询1
'ARRAY("1991","1992","1993","1994","1996","19 ...
- You Don't Know JS: Scope & Closures (第一章:什么是Scope)
Content What is Scope? Lexical Scope Function Vs. Block Scope Hoisting Scope Closures Appendix: Dyna ...
- jquery函数加载及生成随机数
$(document).ready(function () { var code ; //在全局定义验证码 1.将函数写好 function createCode(){ code = "&q ...
- LitePal 数据库使用方法(最新2.0LitePal数据库适用)
转发郭神的blog,讲的非常详细,是基于1.6版本,但现在使用的是2.0,有点差别https://blog.csdn.net/guolin_blog/article/details/384612391 ...
- consul总结
一.介绍 内置了服务注册与发现框 架.分布一致性协议实现.健康检查.Key/Value存储.多数据中心方案,不再需要依赖其他工具(比如ZooKeeper等)服务部署简单,只有一个可运行的二进制的包.每 ...
- leetcode-algorithms-10 Regular Expression Matching
leetcode-algorithms-10 Regular Expression Matching Given an input string (s) and a pattern (p), impl ...
- Spring JdbcTemplate 查询出的Map,是如何产生大小写忽略的Key的?(转)
原文地址:Spring JdbcTemplate 查询出的Map,是如何产生大小写忽略的Key的? 原始讨论组:用Spring JdbcTemplate 查询出的Map,是如何产生大小写忽略的Key的 ...
- jvm加载类(更新中)
作为jvm的用户,从使用者角度来看,我们给jvm输入一个class文件,得到了一个Class对象.我们可以猜想下jvm加载类的过程:class文件有规定的格式,jvm去解析class文件流,读magi ...
- Win32汇编环境搭建教程(MASM32 SDK)
一.说明 常用的32位汇编编译器有微软的MASM.Borland的TASM和NASM. 编译器 开发者 优点 缺点 MASM 微软 微软自家软件和系统兼容性好:支持invoke/.if等伪指令将汇编变 ...
- 在springboot中验证表单信息(六)
构建工程 创建一个springboot工程,由于用到了 web .thymeleaf.validator.el,引入相应的起步依赖和依赖,代码清单如下: 1 2 3 4 5 6 7 8 9 10 11 ...