当前位置: 首页 > news >正文

C++多线程

线程:

async和thread

锁:

C++11中的std::atomic和std::mutex

推荐文章:

C++11 多线程(std::thread)详解_c++11线程使用-CSDN博客

c++ 标准库多线程 - 云山漫卷 - 博客园

std::lock_guard 是一个 RAII 风格的简单的锁管理器,它在构造时自动加锁,在析构时自动解锁。

#include <iostream>
#include <thread>
#include <mutex>
#include <vector>

std::mutex mtx;

void printNumber(int num) {
    std::lock_guard<std::mutex> lock(mtx);  // 自动加锁和解锁
    std::cout << "Number: " << num << "\\\\n";
}

int main() {
    std::vector<std::thread> threads;
    for (int i = 0; i < 10; ++i) {
        threads.emplace_back(printNumber, i);
    }
    for (auto& t : threads) {
        t.join();
    }
    return 0;
}

条件变量(std::condition_variable)用于线程间的同步,允许一个线程等待另一个线程满足某些条件。

配合std::condition_variable::wait() 函数的第一个参数的必须是比lock_guard更灵活控制也更复杂重度的锁:std::unique_lock。它可以RAII自动析构,也可以手动lock/unlock,中间有的代码段就可以释放锁。手动把它unlock之后只是解锁,没有销毁,后续可以按需复用再次 lock/unlock。

#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>

std::mutex mtx;          // 互斥锁
std::condition_variable cv; // 条件变量
bool ready = false;      // 共享状态标志

// 工作线程函数
void printMessage() {
    std::unique_lock<std::mutex> lock(mtx); // 获取互斥锁
    cv.wait(lock, []{ return ready; });      // 等待条件满足(避免虚假唤醒)
    
    // 此处执行需要同步的操作(当ready为true时)
    std::cout << "Message printed after condition met\n";
    // lock会自动释放(unique_lock析构时)
}

int main() {
    std::thread t(printMessage); // 创建并启动线程
    
    {
        std::lock_guard<std::mutex> lock(mtx); // 自动加锁
        ready = true;  // 修改共享状态
        // lock在此作用域结束自动释放
    }
    
    cv.notify_one(); // 通知一个等待线程
    t.join();        // 等待线程结束
    return 0;
}

http://www.dtcms.com/a/77591.html

相关文章:

  • 设计模式之代理模式:原理、实现与应用
  • IntelliJ IDEA新建文件配置作者信息、日期和描述等
  • FSC森林认证证书应用场景
  • python 数据可视化matplotib库安装与使用
  • 如何破解集运企业的劳动密集型困局,提高人效?
  • 10、STL中的unordered_map使用方法
  • Docker 离线安装教程
  • 2025-gazebo配置on vmware,wsl
  • 【练习】PAT 乙 1081 检查密码
  • 【Golang那些事】go1.22和1.23 更新重点及测评
  • nginx性能优化有哪些方式?
  • OpenNJet:下一代云原生应用引擎,支持动态配置与高效管理,简化运维任务,提升应用灵活性与安全性。
  • Sring Boot整合Minio实现图片上传功能
  • Web3 环境下用户数据隐私保护的技术方案分析
  • 【初学者】谈谈DeepSeek使用的算法?
  • 合法C标识符查(信息学奥赛一本通-1134)
  • 告别“人工智障”!给小米音箱“开个挂”?(接入各类AI大模型,让小爱同学秒变全屋智能AI中枢!)
  • 深入解析 Linux 声卡驱动:从架构到实战
  • 《深度学习》—— YOLOv1
  • 【Python数据分析+可视化项目案例】:亚马逊平台用户订单数据分析
  • pytorch3d学习(五)——批量输出图片+对渲染器的位姿解读+npy文件解读
  • 基于django的线上教育平台大数据分析-spark+spider+vue
  • 交易所系统平台开发流程及核心优势解析
  • 记录 macOS 上使用 Homebrew 安装的软件
  • Fragment与React.StrictMode一起使用时有什么需要注意的?
  • 佳能(Canon)摄像机断电dat文件0字节的恢复方法
  • WRF/Chem在线耦合模式:大气污染模拟的时空密码—从气象场驱动到化学反馈的全过程解析
  • Java开发经验——Throwable/Exception异常处理方式
  • Innodb的索引结构和MyISAM有区别吗
  • 哪些企业需要做Ecovadis认证?