【问题标题】:shared/exclusive lock where the shared work should only be done once?共享/独占锁,共享工作只应执行一次?
【发布时间】:2016-03-20 22:34:38
【问题描述】:

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

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

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

  • 如果持有独占锁,或者没有锁:(等待独占被释放,并且)“共享”工作。
  • 如果“共享”锁已被持有或者这是第二个/第“共享工作者”等待排他锁:等待共享锁(第一个“共享工作者”)要被释放,但是做这项工作,而只是返回,因为第一个“共享工作者”已经完成了这项工作。

这种锁/工作模式有名称吗?如果本身没有名称,我很想知道这是否被使用/我写的内容有意义。

【问题讨论】:

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


    【解决方案1】:

    如果您在工作单元上/为工作单元添加“完成”标志,并在排他锁内测试/设置它 - 您会缺少什么?

    【讨论】:

      【解决方案2】:

      我发现这只是共享工作者的额外(正常)锁/互斥锁:

      独家/大师:

      • 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
            • 工作互斥锁已获得,其他工作人员已完成
            • 什么都不做(工作刚刚完成)
            • 释放/返回

      就我而言,整个事情的表现完全无关紧要。排他锁按的顺序持有,共享工作可能需要几百毫秒。该方案应该防止的是,当多个共享“客户端”已共享等待排他锁并被释放时,让多个“客户端”执行(本质上)相同的工作——然后只有一个“客户端”将完成工作,而其他人只会等待它完成并返回。

      是的,这很混乱,但它是对已经很混乱的情况的补充。


      有用的 C++ 类:

      【讨论】:

        猜你喜欢
        • 2015-04-16
        • 2012-08-03
        • 1970-01-01
        • 2014-10-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-11
        • 1970-01-01
        相关资源
        最近更新 更多