簡體   English   中英

為什么std :: timed_mutex :: try_lock_for不起作用?

[英]Why does std::timed_mutex::try_lock_for not work?

我使用gcc-4.8.1(configure:./ configure --prefix = / usr / local)在Ubuntu 12.04中編譯以下代碼,但是當我運行它時,它不起作用。 它沒有停下來等待互斥鎖。 它返回了假,並且輸出了“Hello world!”

命令:g ++ -std = c ++ 11 main.cpp -omain -pthread

當我使用gcc-4.6(apt-get install g ++)編譯它時,它運行良好。 該節目等了大約十秒鍾,並且超過了“Hello world!”

 #include <thread> #include <iostream> #include <chrono> #include <mutex> std::timed_mutex test_mutex; void f() { test_mutex.try_lock_for(std::chrono::seconds(10)); std::cout << "hello world\\n"; } int main() { std::lock_guard<std::timed_mutex> l(test_mutex); std::thread t(f); t.join(); return 0; } 

如果我沒有弄錯的話,那就是Bug 54562 -mutex和條件變量計時器

還提到了bug的原因:

這是因為它使用CLOCK_MONOTONIC時鍾(如果在平台上可用)來計算需要返回的絕對時間,這是不正確的,因為POSIX pthread_mutex_timedlock()調用使用CLOCK_REALTIME時鍾,並且在我的平台上單調時鍾是方式在實時時鍾后面。

但是,這並不能解釋為什么你在gcc-4.6上看到了正確的行為。 也許_GLIBCXX_USE_CLOCK_MONOTONIC未啟用?

可能的解決方法:

const int WAIT_PRECISION_MS = 10;  // Change it to whatever you like
int TIME_TO_WAIT_MS = 2000;        // Change it to whatever you like
int ms_waited = 0;
bool got_lock = false;
while (ms_waited < TIME_TO_WAIT_MS) {
    std::this_thread::sleep_for(
                             std::chrono::milliseconds(WAIT_PRECISION_MS));
    ms_waited += WAIT_PRECISION_MS;
    got_lock = YOUR_MUTEX.try_lock();
    if (got_lock) {
        break;
    }
}

WAIT_PRECISION_MS將告訴while循環多WAIT_PRECISION_MS “喚醒”並嘗試獲取鎖定。 但是,除非您的精確時間是截止時間的一個因素,否則它還會告訴您截止日期的准確程度。

例如:

deadline = 20,precision = 3 :3不是20的因子 - while循環的最后一次迭代將是ms_waited為18.這意味着你要等待總共21ms而不是20ms。

deadline = 20,precision = 4 :4是20的因子 - while循環的最后一次迭代將是ms_waited為16.這意味着你要等到20ms,因為你的截止日期是定義的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM