c++ - 不理解条件变量超时

标签 c++ multithreading c++11 condition-variable

我正在玩游戏以尝试给线程超时。 我尝试使用 std::condition_variable::wait_for但这与我预期的不同。

这里是我的简单代码:

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

std::mutex myMutex;

void waitSec(int seconds)
{
    std::cout <<"t1 start" <<std::endl;
    std::unique_lock<std::mutex> lock(myMutex);
    std::this_thread::sleep_for(std::chrono::seconds(seconds));
    std::cout <<"t1 end" <<std::endl;
}

int main(void)
{
    // launch thread that sleeps 10s
    std::thread t1(waitSec,10);
    std::this_thread::sleep_for(std::chrono::seconds(1));

    // wait for lock during max 1 second
    std::condition_variable* conditionVariable = new std::condition_variable();
    std::cout << "before" << std::endl;
    std::unique_lock<std::mutex> lock(myMutex);
    conditionVariable->wait_for(lock,std::chrono::seconds(1));
    std::cout << "after" << std::endl;

    t1.join();
}

我希望线程 T1 休眠 10 秒。由于我在主线程中为 wait_for 设置了 1 秒超时,因此我希望 aftert1 end 之前打印。

实际情况是 t1 运行了 10 秒,(打印 t1 end)并且在 after 打印后仅 1 秒。

你能解释一下为什么它会这样吗?我应该怎么做才能让我的超时执行超时?

最佳答案

这与 condition_variable 无关。在 10 秒 sleep 之前,您在 waitSec 中有一个 unique_lock,因此没有人能够在 10 秒内获得互斥锁,所以这一行:

std::unique_lock<std::mutex> lock(myMutex);

将等到 waitSec 结束并且 unique_lock 析构函数释放 mutex

您需要在任何其他线程锁定您的互斥量之前创建您的condition_variable

关于c++ - 不理解条件变量超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37316895/

相关文章:

java - 在原子整数数组上使用线程

c++ - 从模板范围获取类型

c++ - 错误位置的对话框

c++ - POSIX - pthread_kill()?

java - sleep() 线程正在 hibernate 主线程,而不是单独的指定线程

java - 中断正在 Java 中进行 HTTP 调用的线程

c++ - Qt橡皮筋没有被绘制

c++ - gdb 重新设置断点时出错(无法访问内存)

c++ - 不实现和删除常用运算符有什么区别?

c++ - 外部模板 'inconsistent explicit instantiations'