std::this_thread::sleep_for()可以有虚假的唤醒吗?
Can std::this_thread::sleep_for() have spurious wakeups?
注意,这不是关于std::condition_variable::wait_for()
的问题。我知道那是虚假的。
我的程序的行为表明这个问题的答案是肯定的,但是STL文档对condition_variable的情况非常清楚。至少在cppreference.com中,this_thread的正确答案似乎是No.
编译器是gcc 4.8.1,如果这是一个缺陷
c++标准的相关章节(段落[thread.thread.this]/7-9)没有提到std::this_thread::sleep_for
的虚假唤醒,不像std::condition_variable::wait_for
。
template <class Rep, class Period> void sleep_for(const chrono::duration<Rep, Period>& rel_time);
7 Effects:阻塞
rel_time
指定的相对超时时间(30.2.4)。8 Synchronization: None.
9 抛出:超时相关异常(30.2.4)。
这意味着你正在观察的行为是不符合标准的。
可以在GCC 4.8.5上复制。
还有一个针对GCC 5.1.0 (gcc.gnu.org/bugzilla/show_bug.cgi?id=66803)的bug报告(并确认)
相关文章:
- 在std::thread中,joinable()然后join()线程安全吗
- <Windows>为什么 std::thread::native_handle 返回类型为"long long unsigned int"的值,而不是 void*(又名 HANDLE)?
- 分离一个静态常量 std::thread?
- 尝试使用 std::vector<std::thread时出现静态断言失败错误>
- 使用 thread 类在 C++ 中构造线程的动态数组时出错
- 当指向对象的指针作为参数传递给 std::thread 时,内存可见性
- 如何从 std::thread 返回值
- 在C++中使用并行化的预期速度是多少(不是 OpenMp,而是 <thread>)
- 虚假唤醒是否会解锁所有等待线程,甚至是不相关的线程?
- 是否有必要获取锁并在不需要唤醒线程时通知condition_variable?
- 将 std::thread by 值推送到列表中
- 转发变量参数列表以模拟 std::thread
- 嵌入式设备 -> std::thread -> FreeRTOS?
- 对 'std::thread::_M_start_thread CMake 的未定义引用进行基准测试
- std::thread 增加 DLL 引用计数,从而防止卸载 DLL
- 如何防止 std::thread 在 QT 中冻结 GUI?
- 如果我们使用 notify_one() 来唤醒线程,我们还需要 yield() - C++?
- 对带有唯一指针的 std::thread 使用类成员函数时出现编译错误
- 避免在条件更新时丢失唤醒是一个阻塞功能
- Boost::线程 / C++11 std::thread,想要唤醒工作线程的条件