📅  最后修改于: 2023-12-03 15:09:03.170000             🧑  作者: Mango
有时候我们需要在std::thread睡眠时唤醒它,可以通过以下方法实现。
std::condition_variable是C++标准库中用于线程同步的条件变量类,可以使用它来实现线程之间的消息传递和值传递。
#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是C++标准库中用于多线程同步的原子布尔类型,可以使用它来实现线程的停止和唤醒操作。
#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则更加简洁易懂,适合实现简单的线程唤醒操作。