- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在这个网站上,我经常在其他论坛上读到诸如“互斥量很重,最好使用其他东西”之类的短语。但我真的找不到解释为什么它很重?另外,如果我们在 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/
在这个网站上,我经常在其他论坛上读到诸如“互斥量很重,最好使用其他东西”之类的短语。但我真的找不到解释为什么它很重?另外,如果我们在 C++20 之前谈论标准 C++11,我们基本上只有 std::m
我是一名优秀的程序员,十分优秀!