我正在尝试用 C++ 编写一种线程池。该代码在 OSX 中运行良好,但在 Linux 下我遇到了一个奇怪的行为。 经过一些调试后,我发现问题是由于对 std::condition_variable::wait_until 的调用造成的,我一定是以错误的方式进行的。
对于下面的代码,我希望循环每三秒循环一次:
#include <mutex>
#include <chrono>
#include <iostream>
#include <memory>
#include <condition_variable>
#include <thread>
using namespace std;
typedef std::chrono::steady_clock my_clock;
typedef std::chrono::duration<float, std::ratio<1> > seconds_duration;
typedef std::chrono::time_point<my_clock, seconds_duration> timepoint;
timepoint my_begin = my_clock::now();
float timepointToFloat(timepoint time) {
return time.time_since_epoch().count() - my_begin.time_since_epoch().count();
}
void printNow(std::string mess) {
timepoint now = my_clock::now();
cout << timepointToFloat(now) << " " << mess << endl;;
};
void printNow(std::string mess, timepoint time ) {
timepoint now = my_clock::now();
cout << timepointToFloat(now) << " " << mess << " " << timepointToFloat(time) << endl;;
};
int main() {
mutex _global_mutex;
condition_variable _awake_global_execution;
auto check_predicate = [](){
cout << "predicate called" << endl;
return false;
};
while (true) {
{ // Expected to loop every three seconds
unique_lock<mutex> lock(_global_mutex);
timepoint planned_awake = my_clock::now() + seconds_duration(3);
printNow("wait until", planned_awake);
_awake_global_execution.wait_until(lock, planned_awake, check_predicate);
}
printNow("finish wait, looping");
}
return 0;
}
但是,有时我得到的输出是:
<X> wait until <X+3>
predicate called
(...hangs here for a long time)
(其中 X 是一个数字),所以似乎超时没有安排在三秒后。有时我会得到:
<X> wait until <X+3>
predicate called
predicate called
<X> finish wait, looping
<X> wait until <X+3> (another loop)
predicate called
predicate called
<X> finish wait, looping
(...continue looping without waiting)
所以看起来超时是在几秒钟后安排的。我想我在超时时间点上搞砸了,但我不知道我做错了什么。
如果可能相关,这段代码在 OSX 中运行良好,而在 Linux 中(Ubuntu 16.04,gcc 5.4,用“g++ main.cc -std=c++11 -pthread”编译)我遇到了奇怪的问题行为。
我怎样才能让它工作?
最佳答案
尝试将超时设置为时钟的持续时间:
auto planned_awake = my_clock::now() +
std::chrono::duration_cast<my_clock::duration>(seconds_duration(3));
关于c++ wait_until奇怪的超时行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47693337/