2015-05-09 56 views
2

我對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); 
} 
+1

我想這是由於虛假的喚醒。 'no_timeout'的'std :: cv_status'文件規定「條件變量被notify_all,notify_one或虛假喚醒」 –

+0

循環運行得儘可能快(100%cpu)。 – mlom

+0

另外,這是唯一運行的線程嗎?也許這是造成虛假喚醒異常數量的根本原因。 –

回答

3

你可能需要使用線程的支持,建立你的可執行文件。在Linux上使用gcc 4.9.2本會去是這樣的:

g++ -std=c++11 test.cpp -o test -pthread 
+0

謝謝!它有幫助。 – mlom

-1

好了,問題是: I /我們正在使用-lpthread選項,而不是對GCC的-pthread選項。

這個奇怪的是其他的東西效果很好,但是這個接近解決方案。

謝謝大家!

+0

接受可能有用的答案是適當的禮節。 @lierdakil答案似乎是正確的。很高興你解決了你的問題! –

+0

對不起,這是我第一篇文章到這個論壇。我沒有看到任何選項接受答案.. – mlom

+0

這Stackoverflow鏈接可以讓你知道如何http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work –

相關問題