C++部分互斥锁/关键段锁
C++ partial mutex/critical section lock
我在VS2010中的C++中工作,我有一个容器类,它有一堆属性(getter和setter)(实际上是一堆有属性的对象——但让我们简化它,并假设它只是容器类上直接的一个属性。
在这个容器类上有一个Update函数,在执行Update方法时阻塞setters方法是很重要的。
这个应用程序是多线程的,所以我想使用互斥/事件/关键部分来处理这个问题。
我的问题是:如何在Update方法运行时锁定/阻止setter,而不让setter方法相互阻止?此外,我还需要setter来阻止Update方法。
换句话说,我需要一个正常的Critical Section机制,除了setter不应该互相阻塞。
提前感谢,Martin
如果不需要同时保护setter(例如:setPropertyX(value)),那么这可以通过单个信号量和手动重置事件来实现,其中初始资源计数是您要保护的属性数。
在任何给定的设置中:
- 按设置等待NoUpdatePendingEvent
- 获取信号量资源(1)
- 更新属性值
- 释放信号量资源(1)
在主更新程序中
- NoUpdatePending事件清除
- 获取信号量资源(n)
- 执行更新
- 释放信号量资源(n)
- NoUpdatePending事件集
其中(n)是您拥有的属性数。设置了NoUpdatePending的初始状态,等待它不会重置它(因此只需要手动重置)。只要有任何属性正在更新,就不能输入更新。一旦输入Update代码并清除NoUpdatePending事件,传入的prop更新将在该事件上暂停,并且不会消耗信号量资源。所有正在运行的道具集最终都将释放继续更新所需的资源。
尽管如此,仍然单独考虑属性并发性。
每个属性都可以有一个关键部分。在setter中,您可以获得特定于属性的关键部分并完成工作,这样每个属性就不会相互阻塞。
在Update
方法中,在进行更新之前获取所有特性特定的关键部分。如果在您更新时有人打电话给setter,这将导致setter现在被阻止。
这里有一个选项,它只使用一个关键部分和一个整数,而不关心您有多少setter:
在每个设置器中:
- 获取关键部分csUpdate
- 联锁增量(&countSettersActive)
- 发布关键部分csUpdate
- 更新属性
- InterlockedDecrement(&countSettersActive)
在主更新例程中:
- 获取关键部分csUpdate
- while(InterlockedCompareExchange(&countSettersActive,0,0)!=0){睡眠(1);}
- 进行更新
- 发布关键部分csUpdate
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 与互斥锁相比,旋转锁可以保证上下文切换
- 将结构字段的类型展开为可变模板参数
- 在java中解决这段代码时面临循环中的问题
- 特征命名访问向量段
- 我应该在锁定TBitmap画布后解锁它吗
- 将位字段导出到数组
- 为了方便起见,我应该避免公开私有字段变量吗
- 修改 VS Code 中的默认C++代码段
- 我是如何在这段代码中出现分段错误的
- 当字段可以为null时,如何使用C++接口在Avro中写入数据
- 在java中读取c++字节的位字段
- 直接读取 pthread 互斥锁的所有者字段是否安全?
- 为什么我的无锁消息队列段错误:(?
- 关键部分的段错误 - 避免死锁
- C++部分互斥锁/关键段锁
- 我是否需要在字段的构造函数中互斥锁
- 我们是否需要互斥锁来访问 C++11 - 多线程中单例对象中的数据字段
- 这段代码还有什么比升压互斥锁更快的吗?
- 应该'这段代码不会导致死锁吗