condition_variable

简介: condition_variable

1.介绍

condition_variable 是一个条件变量,它用于实现线程间的同步。它通常与互斥锁一起使用,以便在等待某个条件时释放锁,并在条件满足时重新获取锁。

可以把 condition_variable 想象成一个餐厅的服务铃。当顾客需要服务时,他会按响服务铃,服务员就会过来为他服务。如果服务员正在忙,顾客就必须等待。当服务员完成工作后,他会检查服务铃是否响过,如果响过,他就会去为顾客服务。

2.例子

下面是一个简单的代码例子,演示了如何使用 condition_variable 来实现线程间的同步:

#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
std::mutex m;
std::condition_variable cv;
bool ready = false;
void print_id(int id) {
    std::unique_lock<std::mutex> lk(m);
    while (!ready) {
        cv.wait(lk);
    }
    std::cout << "thread " << id << '\n';
}
void go() {
    std::unique_lock<std::mutex> lk(m);
    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::cout << "10 threads ready to race...\n";
    go();
    for (auto& th : threads) th.join();
    return 0;
}

在这个例子中,有10个线程等待一个条件变量。当主线程调用 go 函数时,它会通知所有等待的线程继续执行

这段代码定义了一个互斥锁 m,一个条件变量 cv 和一个布尔变量 readyprint_id 函数接受一个整数参数 id,表示线程的编号。在函数内部,首先创建了一个 unique_lock 对象 lk,用于管理互斥锁。然后,使用 while 循环检查 ready 变量的值。如果 readyfalse,则调用条件变量的 wait 函数等待条件满足。当条件满足时(即 ready 变为 true),循环结束,输出线程编号。

go 函数用于通知所有等待的线程继续执行。在函数内部,首先创建了一个 unique_lock 对象 lk,用于管理互斥锁。然后,将 ready 变量的值设为 true,表示条件已经满足。最后,调用条件变量的 notify_all 函数通知所有等待的线程。

main 函数中,首先创建了一个名为 threads 的数组,用于存储线程对象。然后,使用循环创建了10个线程,每个线程都调用 print_id 函数,并传入一个整数参数作为线程编号。

接下来,输出一行提示信息,表示所有线程都已经准备好。然后,调用 go 函数通知所有等待的线程继续执行。

最后,使用一个循环等待所有线程执行完毕。

在这个例子中,所有线程都在等待一个条件变量。当主线程调用 go 函数时,它会通知所有等待的线程继续执行

这里可能有人会问:notify_all唤醒等待的线程后,是所有线程同时执行吗,还是说一个个执行?

当调用条件变量的 notify_all 函数唤醒所有等待的线程时,这些线程会从等待状态变为就绪状态。然后,操作系统调度器会根据其调度策略选择就绪状态的线程并将其调度到可用的处理器上运行。

这意味着,被唤醒的线程并不是同时开始执行,而是由操作系统调度器决定它们的执行顺序。在多处理器系统中,被唤醒的线程可能会并行执行;而在单处理器系统中,被唤醒的线程只能串行执行。

因此,被唤醒的线程的执行顺序和并行性取决于操作系统调度器和硬件环境

那会不会并行执行就不安全了?

并行执行线程本身并不会导致线程不安全。线程安全问题通常发生在多个线程访问共享数据时,如果对共享数据的访问没有进行适当的同步,就可能出现数据竞争和其他线程安全问题。

在上面给出的 condition_variable 的例子中,所有线程都在等待一个条件变量。当主线程调用 go 函数时,它会通知所有等待的线程继续执行。由于每个线程都只访问自己的局部变量,而不访问共享数据,所以这个例子中的线程是安全的,即使它们并行执行也不会出现问题。

如果多个线程需要访问共享数据,那么就需要使用同步机制(如互斥锁、原子变量等)来保证线程安全。这样,即使多个线程并行执行,也不会出现数据竞争和其他线程安全问题

每个线程都只访问自己的局部变量,这里的局部变量是什么?

局部变量是指在函数内部定义的变量。它们只能在定义它们的函数内部访问,当函数执行完毕后,它们就会被销毁。

在上面给出的 condition_variable 的例子中,print_id 函数中定义了一个名为 lk 的局部变量,它是一个 unique_lock 对象,用于管理互斥锁。这个变量只能在 print_id 函数内部访问,当函数执行完毕后,它就会被销毁。

由于每个线程都调用了一次 print_id 函数,所以每个线程都有自己的 lk 变量。这些变量彼此独立,互不影响。因此,即使多个线程并行执行,也不会出现数据竞争和其他线程安全问题

相关文章
|
缓存 编译器 数据处理
【C/C++ 性能优化】循环展开在C++中的艺术:提升性能的策略与实践
【C/C++ 性能优化】循环展开在C++中的艺术:提升性能的策略与实践
1348 0
|
机器学习/深度学习 自然语言处理 算法
生成式 AI 大语言模型(LLMs)核心算法及源码解析:预训练篇
生成式 AI 大语言模型(LLMs)核心算法及源码解析:预训练篇
3348 1
|
2天前
|
人工智能 自然语言处理 JavaScript
2026年Windows+Ollama本地部署OpenClaw保姆级教程:本地AI Agent+阿里云上快速搭建
2026年OpenClaw凭借本地部署、私有化运行的特性,成为打造个人智能体的核心工具,而Ollama作为轻量级本地大模型管理工具,能让OpenClaw摆脱对云端大模型的依赖,实现**本地推理、数据不泄露、全流程私有化**的智能体验。本文基于Windows 11系统,从硬件环境准备、Ollama安装与模型定制、OpenClaw部署配置、技能扩展到常见问题排查,打造保姆级本地部署教程,同时补充阿里云OpenClaw(Clawdbot)快速部署步骤,兼顾本地私有化需求与云端7×24小时运行需求,文中所有代码命令均可直接复制执行,确保零基础用户也能快速搭建属于自己的本地智能体。
4186 18
|
9天前
|
存储 人工智能 负载均衡
阿里云OpenClaw多Agent实战宝典:从极速部署到AI团队搭建,一个人=一支高效军团
在AI自动化时代,单一Agent的“全能模式”早已无法满足复杂任务需求——记忆臃肿导致响应迟缓、上下文污染引发逻辑冲突、无关信息加载造成Token浪费,这些痛点让OpenClaw的潜力大打折扣。而多Agent架构的出现,彻底改变了这一现状:通过“单Gateway+多分身”模式,让一个Bot在不同场景下切换独立“大脑”,如同组建一支分工明确的AI团队,实现创意、写作、编码、数据分析等任务的高效协同。
3584 27
|
13天前
|
人工智能 自然语言处理 监控
OpenClaw skills重构量化交易逻辑:部署+AI全自动炒股指南(2026终极版)
2026年,AI Agent领域最震撼的突破来自OpenClaw(原Clawdbot)——这个能自主规划、执行任务的智能体,用50美元启动资金创造了48小时滚雪球至2980美元的奇迹,收益率高达5860%。其核心逻辑堪称教科书级:每10分钟扫描Polymarket近千个预测市场,借助Claude API深度推理,交叉验证NOAA天气数据、体育伤病报告、加密货币链上情绪等多维度信息,捕捉8%以上的定价偏差,再通过凯利准则将单仓位严格控制在总资金6%以内,实现低风险高频套利。
7180 62
|
3天前
|
人工智能 JSON JavaScript
手把手教你用 OpenClaw + 飞书,打造专属 AI 机器人
手把手教你用 OpenClaw(v2026.2.22-2)+ 飞书,10分钟零代码搭建专属AI机器人!内置飞书插件,无需额外安装;支持Claude等主流模型,命令行一键配置。告别复杂开发,像聊同事一样自然对话。
1544 5
手把手教你用 OpenClaw + 飞书,打造专属 AI 机器人
|
3天前
|
人工智能 网络安全 数据安全/隐私保护
Docker部署OpenClaw(Clawdbot)攻略+阿里云部署OpenClaw 2026版教程
OpenClaw(前身为Clawdbot、Moltbot)作为一款高性能的AI代理平台,凭借自然语言驱动的任务自动化、多平台无缝协作、轻量化容器化架构等核心优势,成为2026年办公自动化、智能协作、跨端指令执行的主流工具,可实现邮件处理、日程管理、航班值机、多IM平台消息联动等丰富功能,无需复杂开发即可快速搭建专属AI助手。Docker作为轻量级容器化技术,能完美解决OpenClaw部署过程中的环境冲突、依赖配置、跨平台兼容等问题,实现一键搭建、快速启动、灵活迁移的部署体验。
1122 2
|
1月前
|
人工智能 自然语言处理 Shell
🦞 如何在 OpenClaw (Clawdbot/Moltbot) 配置阿里云百炼 API
本教程指导用户在开源AI助手Clawdbot中集成阿里云百炼API,涵盖安装Clawdbot、获取百炼API Key、配置环境变量与模型参数、验证调用等完整流程,支持Qwen3-max thinking (Qwen3-Max-2026-01-23)/Qwen - Plus等主流模型,助力本地化智能自动化。
46260 159
🦞 如何在 OpenClaw (Clawdbot/Moltbot) 配置阿里云百炼 API
|
4天前
|
存储 人工智能 BI
2026年OpenClaw(Clawdbot)极简部署:接入小红书全自动运营,一个人=一支团队
2026年的小红书运营赛道,AI自动化工具已成为核心竞争力。OpenClaw(原Clawdbot)凭借“Skill插件化集成、全流程自动化、跨平台联动”的核心优势,彻底颠覆传统运营模式——从热点追踪、文案创作、封面设计到自动发布、账号互动,仅需一句自然语言指令,即可实现全链路闭环。而阿里云作为OpenClaw官方推荐的云端部署载体,2026年推出专属秒级部署方案,预装全套运行环境与小红书运营插件,让零基础用户也能10分钟完成部署,轻松拥有7×24小时在线的“专属运营团队”。
1307 6

热门文章

最新文章