- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在很多地方都读到过一些与 std::condition_variable_any
相关的开销。只是想知道,这是什么开销?
我的猜测是,由于这是一个通用的条件变量,可以与任何类型的锁一起使用,它需要手动滚动实现等待(可能与另一个 condition_variable 和 mutex 或 futex,或类似的东西)所以额外的开销可能来自于那个?但不确定......而不是仅仅作为 pthread_cond_wait()
(以及其他系统上的等价物)等的原生包装器
作为后续,如果我说实现等待的东西,比如共享互斥锁,那么由于性能开销,这种类型的条件变量是不是一个糟糕的选择?在这种情况下我还能做什么?
最佳答案
pthread_cond_wait()
/SleepConditionVariableSRW()
,与普通的 std::condition_variable::wait()
一样,只需要一个,用于释放互斥量、等待条件变量和重新获取互斥量的原子系统调用。该线程立即进入休眠状态,而另一个线程(理想情况下被互斥体阻塞的线程)可以立即接管同一核心。
使用 std::condition_variable_any
,解锁传递的 BasicLockable
并开始等待 native 事件/条件不仅仅是一个系统调用,它调用unlock()
方法首先在 BasicLockable
上执行,然后才发出等待的系统调用。所以你至少有来自单独的 unlock()
的开销,而且你更有可能在操作系统端触发一个不太理想的调度决策。最坏的情况是,解锁甚至会导致另一个内核上的等待线程继续运行,并产生所有相关的开销。
相反,例如在虚假唤醒上,在处理不适用于通用 BasicLockable
的 native 互斥锁(如 std::mutex
中所用)时,也可以进行操作系统端调度优化.
两者都涉及一些簿记,以提供 notify_all()
逻辑(它实际上是每个等待线程的一个事件/条件)以及所有方法都是原子的保证,所以它们都来了无论如何,开销很小。
真正的开销来自于操作系统对组合的信号-等待-锁定系统调用做出良好调度决策的程度。如果操作系统在调度方面不智能,那么它几乎没有任何区别。
关于c++ - 与 std::condition_variable_any 相关的开销是多少,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46618220/
使用 POSIX 条件变量,你可以这样写: while (!_doneWaiting) { wait(lock); } 起初当我看到新的 C++11 风格时,我很兴奋: unique_lock
我正在寻找的是类似于 linux 内核中的 wait_queue_t 的东西。我与同步相关的底层数据结构是无锁的,因此不需要互斥锁的保护。 必须获取 std::mutex 才能使用 std::cond
我有一部分代码,其中一个线程调用如下内容: cond->notify_all(); delete cond; 与 std::condition_variable_any cond; Afaik,这应该
当 condition_variable_any 与 recursive_mutex 一起使用时,recursive_mutex 是否通常可从其他线程获取,同时 condition_variable_
假设有三个线程A、B、C,B和C在某个点挂起,等待A发信号让它们继续。在标准 C++ 提供的线程同步工具中,std::condition_variable 似乎最适合放在这里(尽管仍然不好)。由于 s
我在很多地方都读到过一些与 std::condition_variable_any 相关的开销。只是想知道,这是什么开销? 我的猜测是,由于这是一个通用的条件变量,可以与任何类型的锁一起使用,它需要手
最近,我在 Microsoft Visual Studio 2012(配备 Visual C++ 11)上遇到了奇怪的编译问题。 我移植了大型代码库,主要是在 Linux 上开发的,同时考虑到 C++
条件变量应该有关于 notify() 的单一顺序和 unlock_sleep() (在 wait() 中使用的一个虚构的函数调用,其中互斥锁被解锁并且线程作为一个原子操作序列休眠)操作。使用任意可锁定
std::conditional_variable_any 的实现需要(在 gcc 和 clang 中)一个 std::shared_ptr。 在 wait 方法中,互斥锁的生命周期将延长到本地范围。
是否需要同步std::condition_variable/condition_variable_any::notify_one? 据我所知,如果丢失通知是可以接受的 - 可以调用未 protecte
我可能遗漏了一些明显的东西,但我看不出 std::condition_variable 和 std::condition_variable_any 之间有任何区别。为什么我们都需要? 最佳答案 区别在
我是一名优秀的程序员,十分优秀!