VS2013 でビルドtime_point::max()
し、条件変数のwait_until
結果に指定するとすぐにタイムアウトになります。
time_point::max()
これは直感的ではないように思えます -無期限に (または少なくとも非常に長い時間)待機することを素朴に期待します。これが文書化されているのか、予想される動作なのか、MSVC に固有のものなのか、誰でも確認できますか?
以下のサンプルプログラム。に置き換えるtime_point::max()
とnow + std::chrono::hours(1)
、予想される動作が得られることに注意してください(wait_for
cv が通知されると、タイムアウトなしで終了します)
#include <condition_variable>
#include <mutex>
#include <chrono>
#include <future>
#include <functional>
void fire_cv( std::mutex *mx, std::condition_variable *cv )
{
std::unique_lock<std::mutex> lock(*mx);
printf("firing cv\n");
cv->notify_one();
}
int main(int argc, char *argv[])
{
std::chrono::steady_clock::time_point now = std::chrono::steady_clock::now();
std::condition_variable test_cv;
std::mutex test_mutex;
std::future<void> s;
{
std::unique_lock<std::mutex> lock(test_mutex);
s = std::async(std::launch::async, std::bind(fire_cv, &test_mutex, &test_cv));
printf("blocking on cv\n");
std::cv_status result = test_cv.wait_until( lock, std::chrono::steady_clock::time_point::max() );
//std::cv_status result = test_cv.wait_until( lock, now + std::chrono::hours(1) ); // <--- this works as expected!
printf("%s\n", (result==std::cv_status::timeout) ? "timeout" : "no timeout");
}
s.wait();
return 0;
}