正在同步资源访问

Synchronizing resource access

本文关键字:访问 资源 同步      更新时间:2023-10-16

这是我的问题:

我有一个"引擎"线程,它持续使用资源(由引擎拥有)。其他线程可能想要访问资源,在这种情况下,他们应该告诉引擎暂停并等待,直到完成为止。然而,我不确定用可用的同步原语实现这一点的最佳方式是什么(假设是Windows,尽管从长远来看,我可能也需要支持其他平台)。

在最简单的情况下,引擎将运行一个循环,该循环进入关键部分,做一些工作,然后离开该部分。然而,由于关键部分不是先到先得的,其他试图进入该部分的线程可能会永远陷入困境。

在我以前的解决方案中,我创建了一个通常发出信号的事件对象,引擎每次都会在进入关键部分之前等待该事件。另一个线程会重置事件,然后进入该部分,做一些工作,离开该部分并发出事件信号。但是,如果我有多个(其他)线程试图访问资源,这将不起作用,因为事件对象没有计数器。

我可以简单地使用一个整数计数器,并通过互锁操作对其进行递增/递减,但随后引擎线程将不得不通过循环等待计数器为零,这是在浪费执行时间。同时使用整数计数器、事件和关键部分的"混合"方法似乎过于复杂,不可能是正确的解决方案。

我认为最好的解决方案可能是一个线程安全的计数器,带有"等到零"操作。发动机工作如下:

  1. 获取锁
  2. 如果计数器为非零,请释放锁,等待计数器为零,然后转到步骤1
  3. 做一些工作
  4. 转至步骤2

访问对象:

  1. 递增计数器
  2. 获取锁
  3. 访问对象
  4. 松开锁
  5. 递减计数器