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

时间:2013-07-08 02:36:50

标签: c++ c++11

我使用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;
}

2 个答案:

答案 0 :(得分:6)

如果我没有记错的话,那就是Bug 54562 -mutex and condition variable timers

还提到了错误的原因:

  

这是因为它使用了CLOCK_MONOTONIC时钟(如果可用的话)   平台)计算需要返回的绝对时间,   这是不正确的POSIX pthread_mutex_timedlock()调用使用   CLOCK_REALTIME时钟,在我的平台上,单调时钟是   实时时钟背后的方式。

但是,这并不能解释为什么你会在gcc-4.6上看到正确的行为。可能_GLIBCXX_USE_CLOCK_MONOTONIC未启用?

答案 1 :(得分:0)

可能的解决方法:

WAIT_PRECISION_MS

ms_waited将告诉while循环多长时间“唤醒”并尝试获取锁定。但是,除非您的精确时间是截止时间的一个因素,否则它还会告诉您截止日期的准确程度。

例如:

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

截止日期= 20,精确度= 4 :4是因子20 - 当{{1}}为16时,while循环的最后一次迭代。这意味着你要等到20ms,因为你的截止日期是定义的。