📜  如何在睡眠时唤醒std :: thread?(1)

📅  最后修改于: 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 变量变为 trueMain 线程在等待了 2 秒后将 isReady 设置为 true,并通过 cv.notify_one() 唤醒 WorkerThreadWorkerThread 被唤醒后输出相关信息。

注意事项
  • 唤醒线程需要获得相应的锁,才能成功唤醒。
  • std::condition_variable 必须和 std::mutex 一起使用,并且在等待之前需要获得锁。
  • 假设 std::thread 在睡眠状态时会等待条件变量,这样才能正确唤醒线程。

这是在睡眠时唤醒 std::thread 的一种方法,利用条件变量可以实现多种同步需求。请根据实际需要选择最适合的解决方案。