#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
std::mutex mtx;
std::condition_variable cv;
bool ready = false;
void print_id(int id) {
std::unique_lock<std::mutex> lck(mtx);
while (!ready) {
cv.wait(lck); // 等待条件变量,解锁并进入等待状态
}
// 打印线程ID
std::cout << "thread " << id << '\n';
}
void go() {
std::this_thread::sleep_for(std::chrono::seconds(1)); // 模拟一些准备工作
std::lock_guard<std::mutex> lck(mtx);
ready = true;
cv.notify_all(); // 通知所有等待的线程
}
int main() {
std::thread threads[10];
// 启动多个线程
for (int i = 0; i < 10; ++i)
threads[i] = std::thread(print_id, i);
std::thread(go).detach(); // 启动准备线程
for (auto& th : threads) th.join();
return 0;
}
std::mutex mtx;:定义一个互斥锁,用于保护共享资源(如 ready 变量)。std::condition_variable cv;:定义一个条件变量,用于线程间的同步。bool ready = false;:共享变量,表示是否准备好。初始值为 false。print_id(int id):每个线程执行的函数。它会等待 ready 变为 true,然后打印线程 ID。cv.wait(lck);:调用 wait 方法,使当前线程进入等待状态,并释放锁 lck,直到条件变量被通知。go():模拟一些准备工作后,将 ready 设置为 true 并通知所有等待的线程继续执行。cv.notify_all();:通知所有等待在条件变量上的线程,唤醒它们继续执行。main():创建多个线程来执行 print_id 函数,并启动一个准备线程 go 来设置条件。这个例子展示了如何使用条件变量实现线程间的同步,确保某些线程在特定条件满足后才继续执行。
上一篇:c++ throw
下一篇:c++进制转换
Laravel PHP 深圳智简公司。版权所有©2023-2043 LaravelPHP 粤ICP备2021048745号-3
Laravel 中文站