GCC 4.9.2 / GCC 4.8.1 - std::condition_variable::wait_until(

GCC 4.9.2 / GCC 4.8.1 - std::condition_variable::wait_until(...) bug?

本文关键字:GCC condition wait until variable std      更新时间:2023-10-16

我在C 11条件变量上的方法wait_until有问题。看起来该方法返回std :: cv_status :: no_timeout即使没有通知。下面的代码显示了问题。

下面的代码中有评论说明了问题。

使用的编译器:GCC 4.9.2(在Arch Linux上) GCC 4.8.1(在Ubuntu 14.04上)

我很高兴能为此解决任何帮助。

最佳瑞马,垫子

#include <iostream>
#include <atomic>
#include <condition_variable>
#include <mutex>
#include <thread>
#include <chrono>

std::mutex m;
std::condition_variable v;
void test_wait_until(int ms)
{
    std::unique_lock<std::mutex> lock(m);
    std::cout << ms << "ms startn";
    auto expires = std::chrono::system_clock::now() + std::chrono::milliseconds(ms);
    bool run = true;
    do
    {
        // This loop will run at 100% cpu time until
        // the timeout expires.
        auto status = v.wait_until(lock, expires);
        if(status == std::cv_status::timeout){
            std::cout << ms << "ms expiredn";
            run=false;
        }
        if(status == std::cv_status::no_timeout){
            // If the commend below is removed the
            // termial will be filled by the printout.
            // until the timeout expires.
            //std::cout << ms << "ms did not expiren";
        }
    }while(run);
}

int main()
{
    test_wait_until(20000);
    test_wait_until( 5000);
    test_wait_until(  100);
    test_wait_until(  100);
    test_wait_until(   10);
    test_wait_until(    0);
    test_wait_until(   -10);
    test_wait_until(  -100);
    test_wait_until(  -100);
    test_wait_until( -5000);
    test_wait_until(-20000);
}

您可能需要使用线程支持构建可执行文件。在带有GCC 4.9.2的Linux上,这将是这样的:

g++ -std=c++11 test.cpp -o test -pthread

好的问题是:I/我们使用的是-lpthread选项,而不是gcc的-pthread选项。

奇怪的是其他事情效果很好,但是这是解决方案的接缝。

谢谢大家!