📅  最后修改于: 2023-12-03 14:52:57.527000             🧑  作者: Mango
std::thread
?在多线程编程中,有时我们需要在一个线程睡眠一段时间后唤醒它。C++ 标准库提供了 std::thread
类来支持多线程操作。为了在睡眠时唤醒 std::thread
,可以使用以下方法。
条件变量是一种同步原语,允许线程等待另一个线程满足特定条件。在这种情况下,我们可以使用条件变量来唤醒处于睡眠状态的 std::thread
。下面是一个示例:
#include <iostream>
#include <thread>
#include <condition_variable>
std::mutex mtx;
std::condition_variable cv;
bool isReady = false;
void WorkerThread() {
std::cout << "WorkerThread started" << std::endl;
std::unique_lock<std::mutex> lock(mtx);
// 等待条件变量被唤醒
cv.wait(lock, []{ return isReady; });
std::cout << "WorkerThread woken up" << std::endl;
}
int main() {
std::cout << "Main thread started" << std::endl;
std::thread workerThread(WorkerThread);
std::this_thread::sleep_for(std::chrono::seconds(2));
std::unique_lock<std::mutex> lock(mtx);
// 设置条件变量以唤醒 WorkerThread
isReady = true;
cv.notify_one();
lock.unlock();
workerThread.join();
std::cout << "Main thread exiting" << std::endl;
return 0;
}
在上面的示例中,我们使用了 std::condition_variable
来实现线程间的同步。WorkerThread
在初始状态下处于睡眠状态,并等待 isReady
变量变为 true
。Main
线程在等待了 2 秒后将 isReady
设置为 true
,并通过 cv.notify_one()
唤醒 WorkerThread
。WorkerThread
被唤醒后输出相关信息。
std::condition_variable
必须和 std::mutex
一起使用,并且在等待之前需要获得锁。std::thread
在睡眠状态时会等待条件变量,这样才能正确唤醒线程。这是在睡眠时唤醒 std::thread
的一种方法,利用条件变量可以实现多种同步需求。请根据实际需要选择最适合的解决方案。