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

C++之线程

1.介绍

        在C++中,线程是实现并行开发的核心工具之一。C++11引入了标准库<thread>,提供了对多线程编程的支持。通过线程,程序可以同时执行多个任务,从而提高性能和响应速度。

        线程池介绍在这篇博客——C++之线程池(Thread Pool)-CSDN博客

2.基本概念

        线程——是操作系统能够调度的最小执行单位。一个进程可以包含多个进程,所有线程共享进程的内存空间。

        并发——多个线程同时执行,但可能交替占用CPU资源。

        并行——多个线程同时执行,且同时占用多个CPU资源。

3.C++中的线程库

        C++11引入了<thread>头文件,提供了以下核心功能:

        thread——用于创建于管理线程。

        mutex——用于实现线程间的互斥锁。

        condition_variable——用于实现线程间的条件变量。

        future和promise——用于异步任务的结果获取。

4.用法

        (1)创建线程。使用thread创建线程,并指定线程执行的函数。例如:

#include <iostream>
#include <thread>

void threadFunction() {
    std::cout << "Hello from thread!" << std::endl;
}

int main() {
    // 创建线程并执行 threadFunction
    std::thread t(threadFunction);
    // 等待线程结束,回收
    t.join();
    std::cout << "Main thread finished." << std::endl;
    return 0;
}

        通过上面的简单例子,可以知道如何创建线程并指定线程执行的函数。

        (2)线程的参数传递。可以向线程函数传递参数。例如:

#include <iostream>
#include <thread>

void printMessage(const std::string& message) {
    std::cout << "Message: " << message << std::endl;
}

int main() {
    std::string msg = "Hello, World!";
    std::thread t(printMessage, msg);

    t.join();
    return 0;
}

        如果需要引用传递,可以使用std::ref。

     (3)线程的同步。多个线程访问共享资源时,需要使用同步机制避免竞争条件。

        1.互斥锁(mutex)

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

std::mutex mtx;

void printBlock(char c) {
    std::unique_lock<std::mutex> lock(mtx);
    for (int i = 0; i < 10; ++i) {
        std::cout << c;
    }
    std::cout << std::endl;
}

int main() {
    std::thread t1(printBlock, '*');
    std::thread t2(printBlock, '$');

    t1.join();
    t2.join();

    return 0;
}

        mutex——用于保护共享资源。

        unique_lock——自动管理锁的生命周期。

        2.条件变量(condition_variable)

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

std::mutex mtx;
std::condition_variable cv;
bool ready = false;

void printMessage(int id) {
    std::unique_lock<std::mutex> lock(mtx);
    cv.wait(lock, [] { return ready; });
    std::cout << "Thread " << id << " is running." << std::endl;
}

int main() {
    std::thread threads[3];
    for (int i = 0; i < 3; ++i) {
        threads[i] = std::thread(printMessage, i);
    }

    std::this_thread::sleep_for(std::chrono::seconds(1));
    {
        std::unique_lock<std::mutex> lock(mtx);
        ready = true;
    }
    cv.notify_all();

    for (auto& t : threads) {
        t.join();
    }

    return 0;
}

        condition_variable:用于线程间的条件同步。三个线程都阻塞在cv.wait。

        cv.wait(lock,predicate):等待条件满足。阻塞期间会释放锁。

        cv.notify_all():通知所有等待线程。

        上边程序的运行流程是三个线程调用执行函数,阻塞等待,等待1s后,加锁,条件满足继续执行后续函数,从而实现三个线程同步执行。

        (4)异步任务。使用 std::async和 std::future实现异步任务。

#include <iostream>
#include <future>

int computeSum(int a, int b) {
    return a + b;
}

int main() {
    std::future<int> result = std::async(computeSum, 10, 20);

    std::cout << "Result: " << result.get() << std::endl;
    return 0;
}

        std::async:启动一个异步任务。作用就是避免阻塞主线程。

        std::future:用于获取异步任务的结果。

5.总结

  • C++11 提供了强大的多线程支持,包括线程创建、互斥锁、条件变量和异步任务。

  • 在实际开发中,需要注意线程安全和资源管理问题。

如有错误,敬请指正!!!

相关文章:

  • phpipam1.7安装部署
  • 语义源的速率-失真特征(Rate-Distortion Characteristics of Semantic Sources)在语义通信中的理论分析
  • vue3搭建实战项目笔记二
  • 【开源免费】基于SpringBoot+Vue.JS教师工作量管理系统(JAVA毕业设计)
  • arm linux下的中断处理过程。
  • Uniapp中使用Vue3开发微信小程序的全局状态管理实践
  • 【一文读懂】WebRTC协议
  • Ai人工智能的未来:趋势、挑战与机遇
  • leetcode刷题第十天——栈与队列Ⅱ
  • “RAG界的deepseek”开源-企业复杂私域知识理解与推理框架PIKE-RAG
  • 高精度算法
  • 用大模型学大模型03-数学基础 概率论 最大似然估计(MLE)最大后验估计(MAP)
  • 几款C#开发的入门书籍与视频教程
  • LLaMA-Factory 安装linux部署conda笔记
  • MT6835 21位 磁编码器 SPI 平台无关通用驱动框架 STM32
  • DeepSeek教unity------MessagePack-06
  • 【前端如何实现图片懒加载?】
  • Day65_20250213图论part9_dijkstra(堆优化版)|Bellman_ford算法精讲
  • HTTP 参数污染(HPP)详解
  • 开源大模型性能追平闭源模型技术路径分析
  • 苹果手机为何无法在美制造?全球供应链难迁移
  • 美国务院宣布新一轮与伊朗相关的制裁
  • 航海王亚洲巡展、工厂店直销……上海多区推出“五五购物节”活动
  • 建设银行南昌分行引金融“活水”,精准灌溉乡村沃土
  • “上博号”彩绘大飞机今日启航:万米高空传播中国古代文化
  • 年轻人的事业!6家上海人工智能企业畅想“模范生”新征程