【发布时间】:2021-06-04 22:57:10
【问题描述】:
在这个网站上,我经常在其他论坛上看到诸如“互斥量很重,最好用别的东西”之类的短语。但我真的找不到解释为什么它很重?另外,如果我们谈论的是 C++20 之前的标准 C++11,我们基本上只有 std::mutex,与锁或条件变量一起使用,以使某些东西成为线程安全的,我希望 std 的某些东西非常有效,尤其是如果它是执行某些任务的唯一工具(在 C++20 之前),则在这种情况下是线程安全的。 那么为什么互斥体,尤其是 std::mutex 很重?而我们作为 C++ 开发人员应该使用什么?来自boost的东西?
【问题讨论】:
-
你能举一个例子,有人说互斥锁“很重”吗?我们在这里缺乏关于他们试图做什么以及替代方案是什么的背景。
-
重于什么?在什么情况下?如果您只想增加一个整数,则可以使用
atomic<int>更好地为您服务。 -
std::mutex可以被认为很重,因为它通常使用系统调用来实现,而std::atomic则没有。 -
与“没有互斥锁”相比,互斥锁“重”,但如果你需要一个,你就需要一个,没有办法。如果您可以重组以避免它们并且代码仍然正确,那么恭喜。如果没有,这些成本很小,很烦人,但很有必要。
-
我使用
std::mutex,直到我确定这是分析后的性能问题。然后我会考虑诸如std::atomic之类的替代方案,如果付出的努力(以及更棘手、更难维护的代码)是否值得性能提升。但我发现一个更好的通用方法是尝试所有跨线程对象的不变性,那么这不是问题。
标签: c++ multithreading c++11 boost mutex