共享/独占锁定,共享工作应该只进行一次?

时间:2016-03-20 22:34:39

标签: c++ multithreading design-patterns synchronization naming

我遇到一个问题,我有一种shared/exclusive situation ,除了,共享部分不需要真正分享:我会尝试解释。

独家部分很简单:如果持有独占锁,则在独占锁的所有者释放它之前,不允许任何其他人继续进行。

(不是真正的)共享工作者应该像这样运作:

  • 如果持有独占锁定,或者没有锁定:(等待独家发布,并且执行“共享”工作。
  • 如果已经保持“共享”锁定或者这是第二个/ n th “共享工作者”等待独占锁定:等待共享锁定(要发布的第一个“共享工作者”),但做工作,但只是返回,因为第一个“共享工作者”已经完成了这项工作。

这个锁定/工作模式是否有名称?如果本身没有名称,我感兴趣的是这是否完全使用/我写的内容是否合理。< / p>

2 个答案:

答案 0 :(得分:0)

如果你添加&#34;完成&#34;标志在/为工作单位,并测试/设置在独家锁定内 - 你会缺少什么?

答案 1 :(得分:0)

我发现这只是共享工作者的另一个(普通)锁定/互斥锁:

独家/站长:

  • shared_mutex.lock(); // or timed_lock(timeout)
    • 做好工作......
    • 发布独家锁定

工人/共享:

  • shared_mutex.lock_shared(); // or timed_lock_shared
    • 获得共享锁
    • if (worker_mutex.try_lock()) // normal mutex
      • 工人互斥锁现已锁定
      • 开展工作
      • 发布/返回
    • else if worker_mutex.try_lock() failed
      • 另一名工人正在进行中
      • 等待另一名工人完成:
      • worker_mutex.lock() // or timed lock
        • 工人mutex获得,其他工人完成
        • 什么都不做(工作刚刚完成)
        • 发布/返回

就我而言,整件事的表现完全无关紧要。独占锁定按的顺序保存,共享工作可能需要几百毫秒。该方案应该阻止的是让多个“客户端”在共享多个共享“客户端”等待独占锁并且正在被释放时执行(基本上)相同的工作 - 只有一个“客户端”将执行该工作,其他人只会等待它完成并返回。

是的,它非常混乱,但对于一个已经很混乱的情况来说这是一个特技。

有用的C ++课程: