同步资源访问

时间:2013-11-25 08:13:49

标签: c++ windows multithreading thread-safety

这是我的问题:

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

在最简单的情况下,引擎会运行一个循环,进入一个关键部分,做一些工作,并离开该部分。但是,由于关键部分不是先到先服务,因此尝试进入该部分的其他线程可能永远陷入困境。

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

我可以简单地使用整数计数器并使用互锁操作递增/递减它,但是然后引擎线程必须等到计数器为零并且循环,这会浪费执行时间。使用整数计数器,事件和临界区的“混合”方法似乎过于复杂,无法成为正确的解决方案。

1 个答案:

答案 0 :(得分:0)

我认为最好的解决方案可能是具有“等待零”操作的线程安全计数器。发动机运行如下:

  1. 获取锁。
  2. 如果计数器非零,请解除锁定,等待计数器为零,然后转到步骤1.
  3. 做一些工作。
  4. 转到第2步。
  5. 要访问该对象:

    1. 增加柜台。
    2. 获取锁。
    3. 访问该对象。
    4. 解锁。
    5. 减少柜台。