多线程编程中使用的同步原语,用于等待条件为真。
std::condition_variable wait_for 无限
我试图使用以下代码对条件变量进行无限等待(只是显示问题的示例): std::condition_variable条件; std::互斥体 mtx; std::unique_lock 我试图使用以下代码对条件变量进行无限等待(只是显示问题的示例): std::condition_variable cond; std::mutex mtx; std::unique_lock<std::mutex> lock(mtx); cond.wait_for(lock, std::chrono::steady_clock::duration::max()); 但是等待立即结束。深入研究 wait_for 的(MS)实现,我发现它实际上使用 wait_until 函数。但在此之前,它会通过调用 chrono::system_clock::now() 来转换时间并添加持续时间。 当然,这会导致整数溢出,因此新时间变为 <= 'now'. Thus wait_until 立即退出。 所有其他定时等待函数也会发生同样的情况(例如 try_lock_for 类中的 std::timed_mutex)。 总结以上,我想问一下这是否是定时等待函数实现中的一个bug,如果是的话,我在哪里可以写到它? 此外,由于wait_until使用了system_clock,如果等待期间有时间调整,实际等待时间应该会有所不同(因为system_clock不是单调的)。因此没有信任等待时间。 cpp参考文档说: 请注意,rel_time必须足够小,以免在添加到std::chrono::steady_clock::now()时溢出。 并且: 使用与 timeout_time 相关的时钟,该时钟不需要是单调时钟。如果不连续调整时钟,则无法保证此函数的行为,但现有实现将 timeout_time 从 Clock 转换为 std::chrono::system_clock 并委托POSIX pthread_cond_timedwait 以便等待遵循对系统时钟的调整,但不遵循用户提供的时钟的调整。在任何情况下,由于调度或资源争用延迟,该函数的等待时间也可能比达到 timeout_time 后等待的时间更长。 即使使用的时钟是std::chrono::steady_clock或其他单调时钟,系统时钟调整也可能会导致虚假唤醒。 如果你想要无限超时,你可以这样做(未经测试): wait_until(lock, std::chrono::sys_time::max()); 有点晚了,但对其他人来说也许很有趣:如果你想无休止地等待,就这样做 std::condition_variable cond; std::mutex mtx; std::unique_lock<std::mutex> lock(mtx); cond.wait(lock); 但是,由于虚假唤醒,我还会使用谓词条件,如上面的评论中已经提到的。
假设我有一堆工作线程正在等待,直到队列中有任务。一般来说,你让生产者调用生产函数,然后通知一个,以便工作线程......
正常情况下,输出应该始终是200。但是“totalMoney”的输出有时会小于200。这里有什么问题以及如何纠正它?有人可以帮我吗? #inc...
当超时时,如果触发或虚假唤醒,`wait_until`的返回值是多少?
我对 std::condition_variable::wait_until 的“第一个”版本有一个问题,即没有条件谓词参数的版本,它应该返回 std::cv_status 值。 该...
如何在线程中正确使用condition_variable和time_wait/timed_join?
我遇到了线程的奇怪行为。我在这个简单的例子中隔离了问题: #包括 #包括 #define SLEEP_DURATION 1000 静态增强::
关于condition_variable的问题,为什么condition_variable与mutex配对
我最近一直在学习std::condition_variable,只是有一些问题我无法理解。 Cppreference 和许多其他教程给出了这样的示例: std::互斥体 m; 标准::
为什么我的使用 pthread_cond_signal 的生产者-消费者程序会卡住?
我正在用 C 语言编写一个使用 pthread 的生产者-消费者程序。该程序应该生产和消费最多达到限制 n 的项目。然而,当 n = 1 和 n = 2 时,我的程序通常很快就会卡住。 成为...
我知道 pthread_cond_wait() 应与互斥体一起使用,但我很好奇它是否可以与 rwlock 一起使用。 我阅读了 pthread_cond_wait() 的手册页,它没有说任何有关使用读写锁的内容,...
C#的system.threading.monitor类内部的Monitor.Wait()方法是如何实现的? https://www.codeproject.com/Articles/28785/Thread-synchronization-Wait-and-Pulse-demystified
在调用condition_variable::notify()之前我需要锁定互斥体吗?
我正在阅读条件变量的一些示例代码: 在 cppreference 处,notify_one() 的调用如下: https://en.cppreference.com/w/cpp/thread/condition_variable { std::lock_guard lk(m); ...
为什么std::conditional_variable只能与std::unique_lock一起使用?
std::condition_variable 仅适用于 std::unique_lock,它可以在某些平台上实现最大效率。 std::condition_variable_any 提供了一个有效的条件变量
为什么condition_variable析构函数会挂起这个程序?
我有一个程序,我将其提炼成这个简短的 MRE: #包括 #包括 #包括 #包括 std::互斥体 mu; 标准::
我尝试将线程与条件变量同步以输出曼德尔博特,但我得到了错误的曼德尔博特。 函数output_mandel_line 和compute_mandel_line 已给出并且是正确的。我做了...
我编写了一个简单的类,它将使用 unique_lock 和 condition_variable 同时执行最多 N 个阻塞任务(N 在初始化期间指定)。 我的代码可以编译并运行,但只能
将 std::condition_variable 与自定义(自旋)互斥体一起使用?
我在使用 std::condition_variable 和自定义自旋互斥体实现时遇到困难。看来 std::condition_variable 期望 std::mutex 与其锁相关联,导致......
在一次面试中,我被要求实现一个程序,该程序生成 2 个线程,采用给定的输入向量,一个线程负责仅打印向量的偶数元素,另一个线程......
为什么基于 Valgrind 的 Helgrind 线程错误检测器的 3.22.0 版本会报告数据争用,而 3.18.1 版本却不会?
1.背景 以下来自 cppreference.com 的 C++ 代码说明了如何将 std::condition_variable 与 std::mutex 结合使用以促进线程间通信。 #包括<
我写了一个运行速度不够快的timercallback类: 班主任 { ... void CallFunction(Function* m_function) { 做 { if (m_Status ==
“std::atomic<>”对于“std::condition_variable”来说是必要的还是过度的?
假设有一个简单的缓冲区,用作生产者线程和消费者线程之间某些数据的传输点。通过阅读周围的内容,我整理了以下内容: 常量 std::chrono::
不久前,我正在考虑如何相互实现各种同步原语。例如,在 pthread 中,您可以获得互斥体和条件变量,并且从中可以...