共享/独占锁定,其中共享工作只能执行一次
shared/exclusive lock where the shared work should only be done once?
我有一个问题,我有一种共享/排他性的情况,除了共享部分不需要真正共享的内容:我会尝试解释。
排他部分很简单:如果持有独占锁,则在独占锁的所有者释放它之前,不允许其他人前进。
(不是真正的)共享工作线程应该像这样操作:
- 如果持有独占锁,
- 或者没有锁:(等待独占释放,并)执行"共享"工作。 如果"共享"锁
- 已经持有,或者这是等待独占锁的第二个/n个"共享工作线程":等待(第一个"共享工作线程")的共享锁被释放,但随后不要做工作,而只是返回,因为第一个"共享工作线程"已经完成了工作。
此锁定/工作模式有名称吗?如果本身没有名字,我很感兴趣是否使用它/我写的有意义。
如果您在工作单元上/为工作单元添加"done"标志,并在排他锁中测试/设置该标志 - 您会缺少什么?
我发现这只是共享工人的额外(正常)锁/互斥锁:
独家/主:
-
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
- 工人互斥锁已获得,其他工作线程已完成
- 什么都不做(工作刚刚完成)
- 释放/返回
就我而言,整个事情的表现完全无关紧要。独占锁以秒为单位,共享工作可能需要 100 毫秒。这个方案应该防止的是,当多个共享的"客户端"被共享等待独占锁并被释放时,让多个"客户端"做(本质上)相同的工作——然后只有一个"客户端"会做这项工作,而其他人只会等待它完成并返回。
是的,这很混乱,但对于已经很混乱的情况来说,这是一个
附加方法。有用的C++课程:
-
shared_mutex
@Boost或@Std -
recursive_mutex
相关文章:
- 共享库 (.so) 没有扩展名的 Linux 可执行文件之间的区别?
- Linux 可执行文件通过 dlopen 在emplace_back崩溃打开共享库
- 在另一台 PC 上执行程序时加载 SDL2 共享库时出错
- 如何用共享库替换可执行C++程序的功能?
- CMake 添加和删除宏定义以编译共享库/可执行文件
- 使用共享库编译可执行文件时仅链接所需的符号
- 如果我在 Linux 上更改C++动态共享库,而我的可执行程序在其上使用,会发生什么
- 不同的数学符号绑定与共享库与 dlopen 并直接链接到可执行文件 (Linux)
- 运行可执行文件时找不到共享库,即使共享库存在于指定的路径中
- Ogre 3D共享库与CMAKE链接时,在Linux上执行二进制时找不到
- 我可以固定C 可执行文件,但不能共享库
- 为什么主可执行文件和 dlopen 加载的共享库共享命名空间静态变量的一个副本?
- C++ 可执行文件错误:无法打开共享对象文件:没有此类文件或目录
- 除了共享库之外,g++ -fPIC 也适用于可执行文件
- 当使用rpath时,C++可执行文件无法找到动态链接的共享库
- C++和共享库中的代码执行点
- 如何标识其功能当前正由可执行文件执行的共享库
- "make"的输出是一个共享对象,而不是可执行文件
- Cmake不会将共享库的链接依赖关系传播到我的可执行文件
- 作为共享库的 Linux 可执行文件