正在同步资源访问
Synchronizing resource access
这是我的问题:
我有一个"引擎"线程,它持续使用资源(由引擎拥有)。其他线程可能想要访问资源,在这种情况下,他们应该告诉引擎暂停并等待,直到完成为止。然而,我不确定用可用的同步原语实现这一点的最佳方式是什么(假设是Windows,尽管从长远来看,我可能也需要支持其他平台)。
在最简单的情况下,引擎将运行一个循环,该循环进入关键部分,做一些工作,然后离开该部分。然而,由于关键部分不是先到先得的,其他试图进入该部分的线程可能会永远陷入困境。
在我以前的解决方案中,我创建了一个通常发出信号的事件对象,引擎每次都会在进入关键部分之前等待该事件。另一个线程会重置事件,然后进入该部分,做一些工作,离开该部分并发出事件信号。但是,如果我有多个(其他)线程试图访问资源,这将不起作用,因为事件对象没有计数器。
我可以简单地使用一个整数计数器,并通过互锁操作对其进行递增/递减,但随后引擎线程将不得不通过循环等待计数器为零,这是在浪费执行时间。同时使用整数计数器、事件和关键部分的"混合"方法似乎过于复杂,不可能是正确的解决方案。
我认为最好的解决方案可能是一个线程安全的计数器,带有"等到零"操作。发动机工作如下:
- 获取锁
- 如果计数器为非零,请释放锁,等待计数器为零,然后转到步骤1
- 做一些工作
- 转至步骤2
访问对象:
- 递增计数器
- 获取锁
- 访问对象
- 松开锁
- 递减计数器
相关文章:
- 使用 Bazel 编译 QT 应用程序时访问资源
- 从资源视图访问对话框时出现问题
- 按基类对象访问派生类资源时出错
- 循环访问资源字符串表
- 如何在不设置完整路径的情况下访问 c++ 中的资源
- 根据线程优先级/特权授予对资源的访问权限
- 多个线程访问共享资源
- 如何创建一个随机访问式的Rreference以访问.RC文件中定义的资源
- 从 Android 上的 Unity 中的 C++ DLL 访问 StreamingAssets 资源
- C++无法访问父媒体资源的子媒体资源
- 使用户无法访问资源
- Xcode访问c++中的资源
- QT 5.4,无法从代码访问资源
- 如何访问RCDATA资源的元素
- 如何使用Windows Native API访问PE资源
- scoped_lock访问资源的优雅模式
- CUDA 多线程:__threadfence不会阻止多个线程访问资源
- 如何在 Visual Studio 中运行应用时访问资源
- Android,从本地/NDK共享库访问资源文件
- 从Debian包结构中的程序中访问资源