为什么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中编译了以下代码,但当我运行它时,它不起作用。它没有停下来等待互斥。它返回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毫秒,因为你的最后期限是确定的。
- "error: no matching function for call to"构造函数错误
- 表示"accepting anything for this template argument" C++概念的通配符
- 如何在C++中从两个单独的for循环中添加两个数组
- 在Linux for Windows上编译C++代码时出错
- 调用专用模板时出错"no matching function for call to [...]"
- 为什么我的for循环不能正确获取argv
- 为什么我不能在 FOR LOOP 中使用 i/10,C++?
- Arduino:for/while/if在void setup()或void loop()之前?——错误:之前需要不合格
- 在基于范围的for循环中使用结构化绑定声明
- 通过for循环使用用户输入填充列表
- 使用for循环检查数组中的重复项
- 在for循环中使用auto vs decltype(vec.size())来处理字符串的向量
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 正在使用for循环创建QScatterSerie
- Python中的for循环与C++有何不同
- std::memory_order for std::atomic:<T>:wait
- 在更改for循环的第三部分后,未使用for循环结果
- 在 for 循环中查找问题时遇到困难
- 嵌套for循环C++的问题(初学者)
- std::lock() equivalent for boost::shared_mutex?