【问题标题】: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++ 类: