gpt4 book ai didi

c++ - 为什么互斥锁 (std::mutex) 很重?

转载 作者:行者123 更新时间:2023-12-03 12:44:52 25 4
gpt4 key购买 nike

在这个网站上,我经常在其他论坛上读到诸如“互斥量很重,最好使用其他东西”之类的短语。但我真的找不到解释为什么它很重?另外,如果我们在 C++20 之前谈论标准 C++11,我们基本上只有 std::mutex,与锁或 condition_variable 一起使用,以实现线程安全,我希望 std 中的某些东西非常有效,尤其是如果它是执行某些任务的唯一工具(在 C++20 之前),则在这种情况下是线程安全的。
那么为什么互斥体,尤其是 std::mutex 很重呢?我们作为 C++ 开发人员应该使用什么来代替?来自 boost 的东西?

最佳答案

互斥体被认为是“重的”,因为它们通常被认为会导致系统调用,即到内核的往返。由于特权代码和非特权代码之间的上下文切换,内核之旅需要 1,000 多个 CPU 周期。
如今,在许多操作系统中,互斥锁被优化为在发生争用之前不会进入内核。例如,在 Linux 中它是使用 futex(“快速用户空间互斥锁”)实现的,在 Windows 中 - SRW 锁。但是,一旦发生争用,就会有内核的行程。一旦一个线程需要等待,它就会被操作系统“置于 sleep 状态”,并且在释放锁的那一刻和该线程被安排再次执行的时间之间会有很大的延迟。
如果您需要同步,有时会在一个简单的 atomic 上循环就足够了。如果争用很少而且很短,那么您可以通过“自旋锁”获得更好的性能,即循环直到满足特定条件。即使循环 10000 次,它也可以比单个系统调用更快。
然而,在实践中,互斥体将在性能和便利性之间提供足够的平衡。因此,除非您计算纳秒(如在 HFT 或实时应用程序中),否则我不会担心它。

关于c++ - 为什么互斥锁 (std::mutex) 很重?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66506475/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com