で、本当の問題は、condition_variable::wait_for()の述語バージョンのコードでして
諸般の事情でネットから拾ってきたコードを一部変更して書きますと(たぶんインデントが
壊れますが、ご了承ください)

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

std::mutex mtx;
std::condition_variable cv;
std::atomic<bool> ready = false;

void wait_for_event() {
std::unique_lock<std::mutex> lock(mtx);
cv.wait_for(lock, std::chrono::seconds(3), []{ return ready; });
std::cout << "Event occurred or timeout reached" << std::endl;
}

int main(void) {
std::thread worker(wait_for_event);
worker.join();
return 0;
}