为什么std::timed_mutex::try_lock_for不起作用

Why does std::timed_mutex::try_lock_for not work?

本文关键字:lock for 不起作用 try mutex timed 为什么 std      更新时间:2023-10-16

我使用gcc-4.8.1(configure:./configure--prefix=/usr/local)在Ubuntu 12.04中编译了以下代码,但当我运行它时,它不起作用。它没有停下来等待互斥。它返回false,并输出"Hello world!"

命令:g++-std=c++11 main.cpp-domain-phread

当我使用gcc-4.6(apt-get-installg++)编译它时,它运行得很好。该程序等待了大约10秒,并输出"你好,世界!"

#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 worldn";
}
int main()
{
    std::lock_guard<std::timed_mutex> l(test_mutex);
    std::thread t(f);
    t.join();
      return 0;
}

如果我没有错的话,那就是Bug 54562——互斥和条件变量定时器。

还提到了错误的原因:

这是因为它使用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循环"唤醒"并尝试获取锁的频率。但是,它也会告诉你的截止日期有多准确,除非你的准确时间是截止日期时间的一个因素。

例如:

截止日期=20,精度=3:3不是20的因子-while循环的最后一次迭代将在ms_waited为18时进行。这意味着你总共要等待21毫秒,而不是20毫秒。

截止日期=20,精度=4:4是20的因子-while循环的最后一次迭代将在ms_waited为16时进行。这意味着你要等20毫秒,因为你的最后期限是确定的。