- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我读了一些关于 std::condition_variable
的内容更具体地说,如何使用 std::condition_variable::notify_one
通知等待线程。
我遇到了几个问题,我很乐意得到答案:
notify_one
时到底发生了什么(OS-wise)?我想这是特定于操作系统的,所以为了争论起见——我在 Windows 中工作。notify_one
会怎样?此调用是否有任何性能影响(CPU 周期、功率等)?谢谢
最佳答案
在 Windows 上,std::condition_variable
很可能根据 native Windows 条件变量来实现。请参阅:https://msdn.microsoft.com/en-us/library/windows/desktop/ms682052(v=vs.85).aspx
在类 unix 系统上,它们通常根据 pthreads 信号量/互斥量对来实现。
整个操作应该在用户空间中进行,因此您无需为切换到内核模式而付费,但您将在幕后使用两个同步原语。这将意味着将发布内存栅栏,因此总是要付出一些代价。
长话短说,在您应该调用 notify_one
时调用,即在更改条件状态并释放锁之后,这是一个相当便宜的操作。无缘无故地在紧密循环中调用 notify_one
可能不是一个好主意。
What happens if a thread calls notify_one when there is no waiting thread?
取一个mutex,检查是否有线程在等待,释放mutex。结束。
Does this call have any performance impact (CPU-cycles, power etc)?
当然可以,它会消耗几个周期,并且需要 CPU 处于运行状态。偶尔做一次不会有什么坏处。在紧密的循环中连续执行此操作会耗电。
我想我的问题是“用例是什么”?如果您每秒向生产者/消费者队列添加一百万个项目,那么您将花费大量时间和精力通知不存在的消费者。如果您每秒增加 10 个,花费在 notify_one
上的时间可能甚至不会显示在任何性能轨迹上。
关于c++ - notify_one 性能影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35265409/
我读了一些关于 std::condition_variable 的内容更具体地说,如何使用 std::condition_variable::notify_one 通知等待线程。 我遇到了几个问题,我
我有一个关于notify_one函数的问题。在下面的代码中, #include #include #include #include #include std::condition_vari
我对std::condition_variable的使用有点困惑.我知道我必须创建一个 unique_lock在 mutex调用前 condition_variable.wait() .我找不到的是我
这个问题已经有答案了: std::condition_variable::notify_one() called several times without context switching (1
我有一个异步处理任务的“引擎”,对于一个任务,我想等到该任务被处理完。 boost::condition_variable cvWorkDone; DoSomeWork() { PostAsyn
boost::condition_variable::notify_one() 函数是自动恢复执行它解除阻塞的线程,还是未定义并取决于操作系统如何调度线程? 我不太熟悉线程以及操作系统如何与它们交互,
我可以安全地执行以下代码吗?是否有可能在这里出现死锁或一些意外行为,尤其是当 SIGINT 到达时? #include #include #include std::mutex m; std::
条件变量的典型用法如下所示(参见下面的代码):http://en.cppreference.com/w/cpp/thread/condition_variable . 但是,似乎主线程可能会在工作线程
我有如下代码: #include #include #include std::mutex mtx; std::condition_variable cv; std::future worker
据我了解,当我有一组线程受 std::lock_guard 或 std::unique_lock 保护 std::mutex 并且通过显式解锁或锁超出范围解锁互斥锁,然后通知等待线程。 这个通知是 n
本例中有多少等待线程会被唤醒: 第一个线程: void wakeUp2Threads() { std::unique_lock lock(condvar_mutex); condvar
我有一个用于读取/写入的环形缓冲区。我跟踪环形缓冲区中的条目数,并且不允许覆盖尚未读取的条目。我使用 std::condition_variable wait() 和 notify_one() 来同步
我的线程作为链表运行(有重叠,因此线程),实现与时间线没有什么不同的东西。每个条件变量解锁链表中的下一个线程。 当我只有一个要通知时,我应该使用 notify_all() 还是 notify_one(
出于某种原因,调用 signal.notify_one() 会阻塞当前线程并且不会返回。我从未听说过这种行为,也不知道如何解决。 { std::lock_guard lock(_mutex);
在使用 Boost 线程的单一生产者/单一消费者应用程序中,如果生产者线程在消费者线程调用 cond_var 之前多次调用 cond_var.notify_one() 会发生什么情况。等待(锁定) ?
是否需要同步std::condition_variable/condition_variable_any::notify_one? 据我所知,如果丢失通知是可以接受的 - 可以调用未 protecte
考虑第一个线程函数和全局变量: std::mutex mut; std::condition_variable officer; bool firstPlayerIsReady
前言:我在这里看到过类似的问题,但似乎没有一个能回答我的问题。 是否有可靠的方法来确保消费者线程中的 wait() 方法在生产者线程的第一个 notify_one() 调用之前被调用? 即使在消费者线
我正在尝试运行一个 websocket++ 示例,它包含从 websocket 客户端接收消息并广播到所有连接的客户端,但我在线程同步方面遇到问题。 在代码示例中,方法 process_message
我已阅读 Concurrency: Atomic and volatile in C++11 memory model和 How std::memory_order_seq_cst works ,它没
我是一名优秀的程序员,十分优秀!