Я играю, чтобы попытаться дать тайм-аут в тему. Я пытаюсь использовать 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 секунд. Поскольку я даю 1с таймауту wait_for
в основном потоке, я бы ожидал, что after
напечатан до t1 end
.
Что происходит, так это то, что t1 работает в течение 10 секунд (печать t1 end
) и всего 1 с после печати after
.
Можете ли вы объяснить мне, почему он ведет себя так и что мне нужно сделать, чтобы мой тайм-аут выполнялся как тайм-аут?
похоже, что t1 заблокирован myMutex, и основной поток должен ждать, пока он его не выпустит – DAG