线程同步——用户模式下线程同步——Slim读写锁实现线程同步
//Slim读/写锁实现线程同步
SRWlock 的目的和关键段相同:对同一资源进行保护,不让其它线程访问。
但是,与关键段不同的是,SRWlock允许我们区分哪些想要读取资源的线程(读取者线程)
和哪些想要更新资源值的线程(写入者线程)。让所有读取者资源在同一时刻访问共享资源应该是
可行的,这是因为仅仅读取资源并不存在破坏数据的风险。只有当写入者线程想要对资源进行更新时才需要同步。
这种情况下,写入者线程应该独占资源访问权:任何线程,无论是读取还是写入者线程,都不许访问资源。
这就是SRWlock强大之处。 //使用步骤:
//(1)必须先定义 CRITICAL_SECTION 结构
SRWLOCK g_cs;
//(2)初始化关键段 SRWLOCK
InitializeSRWLock(&g_cs);
//3)写入者线程
DWORD WINAPI ThreadFunOne(PVOID pvParam)
{
AcquireSRWLockExclusive(&g_cs) ; //写入资源 应该放在AcquireSRWLockExclusive和ReleaseSRWLockExclusive函数之间
g_x ++ ; ReleaseSRWLockExclusive(&g_cs);
return ;
}
//4)读取者线程
DWORD WINAPI ThreadFunTwo(PVOID pvParam)
{
AcquireSRWLockShared(&g_cs) ; //读取资 源应该放在AcquireSRWLockShared和ReleaseSRWLockShared函数之间
cout<<"ThreadFunTwo:"<<g_x<<endl ; ReleaseSRWLockShared(&g_cs);
return ;
} 不存在用来删除或者销毁 SRWLOCK 的函数,因为系统会自动执行清理工作 与关键段相比,SRWlock 缺乏两个特性。
)不存在TryEnter(Shared/Exclusive)SRWLock之类的函数:如果锁已经被占用,
那么调用AcquireSRWLock(Shared/Exclusive)会阻塞调用线程。
)不能递归的获得 SRWLOCK 也就是说一个线程不能多次写入资源而多次锁定资源,
然后多次调用ReleaseSRWLock*来释放资源锁定。 #include "windows.h"
#include "iostream"
using namespace std;
long g_x = ;
//(1)必须先定义 CRITICAL_SECTION 结构
SRWLOCK g_cs; //定义线程函数1
DWORD WINAPI ThreadFunOne(PVOID pvParam) ; //定义线程函数2
DWORD WINAPI ThreadFunTwo(PVOID pvParam); int main()
{ //(2)初始化关键段 SRWLOCK
InitializeSRWLock(&g_cs); //创建线程1
HANDLE hThreadOne = CreateThread(NULL,,ThreadFunOne,,,NULL);
CloseHandle(hThreadOne); //创建线程2
HANDLE hThreadTwo = CreateThread(NULL,,ThreadFunTwo,,,NULL);
CloseHandle(hThreadTwo); //让主线程先挂起,确保其它线程执行完成
Sleep();
cout<<g_x<<endl; //(4)清理CRITICAL_SECTION结构,必须确保已经没有资源使用此关键段,否则会出现不可预料的结果 return ;
} DWORD WINAPI ThreadFunOne(PVOID pvParam)
{
AcquireSRWLockExclusive(&g_cs) ; //写入资源 应该放在AcquireSRWLockExclusive和ReleaseSRWLockExclusive函数之间
g_x ++ ; ReleaseSRWLockExclusive(&g_cs);
return ;
} DWORD WINAPI ThreadFunTwo(PVOID pvParam)
{
AcquireSRWLockShared(&g_cs) ; //读取资 源应该放在AcquireSRWLockShared和ReleaseSRWLockShared函数之间
cout<<"ThreadFunTwo:"<<g_x<<endl ; ReleaseSRWLockShared(&g_cs);
return ;
}
线程同步——用户模式下线程同步——Slim读写锁实现线程同步的更多相关文章
- 线程同步——用户模式下线程同步——Interlocked实现线程同步
线程同步分为用户模式下的线程同步和内核对象的线程同步. 当然用户模式下的线程同步实现速度比内核模式下快,但是功能也有局 //1.利用原子访问: Interlocked系列函数,关于Interlocke ...
- WINDOWS 同步(Interlocked,InterlockedExchangeAdd,Slim读/写锁,WaitForSingleObject,CreateWaitableTimer等等)
NOTE0 在以下两种基本情况下,线程之间需要相互通信: 需要让多个线程同时访问一个共享资源,同时不能破坏资源的完整性: 一个线程需要通知其它线程某项任务已经完成 1.原子访问:Interlocked ...
- Linux:使用读写锁使线程同步
基础与控制原语 读写锁 与互斥量类似,但读写锁允许更高的并行性.其特性为:写独占,读共享. 读写锁状态: 一把读写锁具备三种状态: 1. 读模式下加锁状态 (读锁) 2. 写模式下加锁 ...
- 【windows核心编程】 第八章 用户模式下的线程同步
Windows核心编程 第八章 用户模式下的线程同步 1. 线程之间通信发生在以下两种情况: ① 需要让多个线程同时访问一个共享资源,同时不能破坏资源的完整性 ② 一个线程需要通知其他线程 ...
- 第8章 用户模式下的线程同步(4)_条件变量(Condition Variable)
8.6 条件变量(Condition Variables)——可利用临界区或SRWLock锁来实现 8.6.1 条件变量的使用 (1)条件变量机制就是为了简化 “生产者-消费者”问题而设计的一种线程同 ...
- 第8章 用户模式下的线程同步(3)_Slim读写锁(SRWLock)
8.5 Slim读/写锁(SRWLock)——轻量级的读写锁 (1)SRWLock锁的目的 ①允许读者线程同一时刻访问共享资源(因为不存在破坏数据的风险) ②写者线程应独占资源的访问权,任何其他线程( ...
- windows核心编程---第七章 用户模式下的线程同步
用户模式下的线程同步 系统中的线程必须访问系统资源,如堆.串口.文件.窗口以及其他资源.如果一个线程独占了对某个资源的访问,其他线程就无法完成工作.我们也必须限制线程在任何时刻都能访问任何资源.比如在 ...
- Windows核心编程:第8章 用户模式下的线程同步
Github https://github.com/gongluck/Windows-Core-Program.git //第8章 用户模式下的线程同步.cpp: 定义应用程序的入口点. // #in ...
- 《windows核心编程系列》七谈谈用户模式下的线程同步
用户模式下的线程同步 系统中的线程必须访问系统资源,如堆.串口.文件.窗口以及其他资源.如果一个线程独占了对某个资源的访问,其他线程就无法完成工作.我们也必须限制线程在任何时刻都能访问任何资源.比如在 ...
随机推荐
- echarts实现全国地图
1.首先我没有按需引入echarts,我是全局引入的,所以说在node_modules中有 这个china,你只需要在你的页面引入即可 但是按需引入echarts 的 项目中node_modules中 ...
- css省...和div 内容过多,自动换行
1.shengluohao 就是这个... 加: overflow: hidden;/*超出部分隐藏*/ white-space: nowrap;/*不换行*/ text-overflow:ellip ...
- cocos2d JS 利用定时器实现-倒计时功能
//创建一个定时器 cc.director.getScheduler().schedule(this, this.updates, 1, cc.REPEAT_FOREVER, 0, false, &q ...
- ecshop 订单状态
ecshop的订单状态都是在ecs_order_info表中的字段里. 订单状态 未确认 取消 确认 已付款 配货中 已发货 已收货 退货 order_status 0 2 1 1 1 5 5 4 s ...
- React-Native组件之Text内文字垂直居中方案
style: { height: 100, textAlign: 'center', textAlignVertical: 'center', } 以上方法在Android上显示水平垂直居中, 但在I ...
- Django中的View视图讲解
Django中的View视图(view.py)是负责处理用户请求和返回响应的逻辑. 视图函数或视图简而言之就是一个python函数,它接受一个web请求并返回一个Web响应. 此响应可以是网页的HTM ...
- sudo安装某一文件报错:E: 无法获得锁 /var/lib/dpkg/lock - open (11: 资源暂时不可用) E: 无法锁定管理目录(/var/lib/dpkg/),是否有其他进程正占用它?
报错原因:资源被占用 解决方法: sudo rm /var/cache/apt/archives/lock sudo rm /var/lib/dpkg/lock
- Tomcat 9 和tomcat 8区别以及 tomcat9 新特性
1.Tomcat 9.0.0.M1 (alpha) 版本的主要特点 详细信息请点击:Tomcat 9.0.0.M1 其他版本信息:详细参见官网,传送门 注明:当前版本要求最低的Java环境为 1.8+ ...
- verdi bin工具
verdi安装目录下会有很多小的工具: 1)波形类型转换类:fsdb2saif,fsdb2vcd, log2fsdb(只能增加某些周期性信号,从log txt直接产生fsdb波形,适合于siloti的 ...
- vs2015 C#打包程序为exe
说明:将自己写的C#源代码打包后生成exe,直接安装在别人的电脑上运行,就像我们在网上下载别人的软件一样,很高大上,vs2015提供了打包和生成exe功能: 步骤一.打开vs2015(其他版本应该也是 ...