我正在玩游戏以尝试给线程超时。 我尝试使用 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 秒超时,因此我希望 after
在 t1 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/