2013-04-16 35 views
4

在我的電腦,在Windows 7上,下面的代碼,在Visual C++ 2010與升壓1.53編譯運行,輸出不同的行爲:: VC下condition_variable ++和GCC

no timeout 
elapsed time (ms): 1000 

相同的代碼使用GCC編譯4.8 (online link)輸出

timeout 
elapsed time (ms): 1000 

我的意見是,VC++輸出是不正確的,它應該是timeout。有沒有人在VC++中有相同的輸出(即no timeout)?如果是的話,那麼這是在boost::condition_variable的Win32實現中的錯誤?

的代碼是

#include <boost/thread.hpp> 
#include <iostream> 

int main(void) { 
    boost::condition_variable cv; 
    boost::mutex mx; 
    boost::unique_lock<decltype(mx)> lck(mx); 
    boost::chrono::system_clock::time_point start = boost::chrono::system_clock::now(); 
    const auto cv_res = cv.wait_for(lck, boost::chrono::milliseconds(1000)); 
    boost::chrono::system_clock::time_point end = boost::chrono::system_clock::now(); 
    const auto count = (boost::chrono::duration_cast<boost::chrono::milliseconds>(end - start)).count(); 
    const std::string str = (cv_res == boost::cv_status::no_timeout) ? "no timeout" : "timeout"; 
    std::cout << str << std::endl; 
    std::cout << "elapsed time (ms): " << count << std::endl; 
    return 0; 
} 

回答

6

如果我們看,我們看到的文檔:

以原子呼叫lock.unlock(),並阻塞當前線程。在由rel_time 參數指定的時間段過去後,通過調用this-> notify_one()或 this-> notify_all(),線程將解除阻塞,或虛假地 ... [強調我的]

你幾乎可以肯定地看到的是,VS實現將它視爲虛假的喚醒,恰好在預期的持續時間結束時,而另一個實現將其視爲超時。

相關問題