我對C++ 11條件變量上的方法wait_until有問題。它看起來像方法返回std :: cv_status :: no_timeout即使沒有通知。下面的代碼顯示了這個問題。GCC 4.9.2/GCC 4.8.1 - std :: condition_variable :: wait_until(...)錯誤?
下面的代碼中有評論可以說明問題。
編譯器使用:GCC 4.9.2(對Arch Linux的) GCC 4.8.1(在Ubuntu 14.04)
我感激所有幫助我能解決這個問題。
最佳regars, 墊
#include <iostream>
#include <atomic>
#include <condition_variable>
#include <mutex>
#include <thread>
#include <chrono>
std::mutex m;
std::condition_variable v;
void test_wait_until(int ms)
{
std::unique_lock<std::mutex> lock(m);
std::cout << ms << "ms start\n";
auto expires = std::chrono::system_clock::now() + std::chrono::milliseconds(ms);
bool run = true;
do
{
// This loop will run at 100% cpu time until
// the timeout expires.
auto status = v.wait_until(lock, expires);
if(status == std::cv_status::timeout){
std::cout << ms << "ms expired\n";
run=false;
}
if(status == std::cv_status::no_timeout){
// If the commend below is removed the
// termial will be filled by the printout.
// until the timeout expires.
//std::cout << ms << "ms did not expire\n";
}
}while(run);
}
int main()
{
test_wait_until(20000);
test_wait_until(5000);
test_wait_until( 100);
test_wait_until( 100);
test_wait_until( 10);
test_wait_until( 0);
test_wait_until( -10);
test_wait_until( -100);
test_wait_until( -100);
test_wait_until(-5000);
test_wait_until(-20000);
}
我想這是由於虛假的喚醒。 'no_timeout'的'std :: cv_status'文件規定「條件變量被notify_all,notify_one或虛假喚醒」 –
循環運行得儘可能快(100%cpu)。 – mlom
另外,這是唯一運行的線程嗎?也許這是造成虛假喚醒異常數量的根本原因。 –