Laravel  
laravel
文档
数据库
架构
入门
php技术
    
Laravelphp
laravel / php / java / vue / mysql / linux / python / javascript / html / css / c++ / c#

c++条件变量

作者:躲藏我的霸气   发布日期:2026-03-05   浏览:76

#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++进制转换

大家都在看

c++闭包

c++向上取整的代码

c++单引号和双引号的区别

c++ 注释

c++如何判断素数

c++ functional

c++框架代码

c++格式化字符串

c++ orm框架

c++ string类

Laravel PHP 深圳智简公司。版权所有©2023-2043 LaravelPHP 粤ICP备2021048745号-3

Laravel 中文站