我使用 gcc-4.8.1(configure: ./configure --prefix=/usr/local) 在 Ubuntu 12.04 中编译以下代码,但是当我运行它时,它不起作用。它没有停下来等待互斥体。它返回 false,并输出“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 - 互斥锁和条件变量计时器 http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54562.
还提到了该错误的原因:
这是因为它使用 CLOCK_MONOTONIC 时钟(如果在
platform) 计算需要返回的绝对时间,
这是不正确的,因为 POSIX pthread_mutex_timedlock() 调用使用
CLOCK_REALTIME 时钟,在我的平台上,单调时钟是
远远落后于实时时钟。
但是,这并不能解释为什么您会看到正确的行为gcc-4.6
尽管。也许_GLIBCXX_USE_CLOCK_MONOTONIC
没有启用?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)