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

📅  最后修改于: 2023-12-03 15:09:03.170000             🧑  作者: Mango

如何在睡眠时唤醒std::thread?

有时候我们需要在std::thread睡眠时唤醒它,可以通过以下方法实现。

方案一:使用std::condition_variable

std::condition_variable是C++标准库中用于线程同步的条件变量类,可以使用它来实现线程之间的消息传递和值传递。

步骤
  1. 将std::condition_variable作为std::thread的成员变量。
  2. 在std::thread执行的函数中加入wait()方法,等待唤醒信号。
  3. 在外部线程中使用notify_one()或notify_all()方法来唤醒std::thread。
代码示例
#include <iostream>
#include <thread>
#include <chrono>
#include <mutex>
#include <condition_variable>

std::mutex mtx;
std::condition_variable cv;

void thread_func() {
  std::unique_lock<std::mutex> lock(mtx);
  // 睡眠10秒钟
  std::this_thread::sleep_for(std::chrono::seconds(10));
  std::cout << "Thread wake up!" << std::endl;
}

int main() {
  std::thread t(thread_func);
  // 等待2秒钟
  std::this_thread::sleep_for(std::chrono::seconds(2));
  // 唤醒线程
  cv.notify_one();
  t.join();
  return 0;
}
方案二:使用std::atomic_bool

std::atomic_bool是C++标准库中用于多线程同步的原子布尔类型,可以使用它来实现线程的停止和唤醒操作。

步骤
  1. 将std::atomic_bool作为std::thread的成员变量。
  2. 在std::thread执行的函数中加入while循环,判断std::atomic_bool的值是否为true,如果为false则调用wait()方法等待信号。
  3. 在外部线程中使用std::atomic_bool的store()方法来唤醒std::thread。
代码示例
#include <iostream>
#include <thread>
#include <chrono>
#include <atomic>

std::atomic_bool flag(false);

void thread_func() {
  while (!flag) {
    // 等待唤醒信号
    std::this_thread::sleep_for(std::chrono::seconds(1));
  }
  std::cout << "Thread wake up!" << std::endl;
}

int main() {
  std::thread t(thread_func);
  // 等待2秒钟
  std::this_thread::sleep_for(std::chrono::seconds(2));
  // 唤醒线程
  flag.store(true);
  t.join();
  return 0;
}
结论

以上两种方法都可以在std::thread睡眠时唤醒它,但std::condition_variable更加灵活,可以实现更多的线程同步操作。而std::atomic_bool则更加简洁易懂,适合实现简单的线程唤醒操作。