【发布时间】:2020-07-06 14:41:04
【问题描述】:
我有两种方法“log”和“measure”,它们永远不应该同时执行。 所以我尝试使用“std::mutex”来执行此操作,如下所示:
void log(std::string message)
{
mtx.lock();
someLogFunctionality();
mtx.unlock();
}
void measure()
{
mtx.lock();
someMeasureFunctionality();
mtx.unlock();
}
现在事实证明,也可以在不锁定的情况下并行多次调用“log”,同样适用于“measure”。 (原因:someLogFunctionality() 和 someMeasureFunctionality() 相互干扰,但同一个方法可能会被并行调用多次)
当时我查看了“std::shared_mutex”,但对我来说有两个问题:
1.) 使用 shared_mutex 我可以仅将 lock_shared 用于其中一种方法(日志或测量),但另一种方法必须使用排他锁(并且不能再次并行执行多次)
void log(std::string message)
{
mtx.lock_shared();
someLogFunctionality();
mtx.unlock_shared();
}
void measure()
{
mtx.lock(); // This should also be shared but among another "group"
someMeasureFunctionality();
mtx.unlock();
}
2.) 我不能使用 C++17(我正在使用的环境中的约束)
您对我如何实现这一点有什么建议吗?
【问题讨论】:
-
这是“单车道桥问题”的一个实例。你想要的可以使用信号量来完成。我不记得具体怎么做,所以我不会写答案,但如果你搜索那个短语,你应该会找到一些指南。
-
顺便说一句,您应该删除 C 语言标签。 C 语言没有
std::string也没有std::shared_mutex。 C 语言没有命名空间。请酌情更新您的语言标签。
标签: c++ locking mutex semaphore