C++多线程——线程

1、线程与进程

进程是一个具有独立功能程序的运行实体,如某一个程序,运行时便产生一个进程;通常一个进程包含一个或多个线程。普通C程序多是只含有一个线程的进程,但是大多数情况下遇到的是多线程的进程。

线程与进程都是操作系统的概念。不同进程之间相互独立,同一进程的线程共享该进程的地址空间及其他资源。

线程与进程关系如下图:

2、与 C++11 多线程相关的头文件

c++11 新标准中引入了五个头文件来支持多线程编程,他们分别是<atomic> ,<thread>,<mutex>,<condition_variable>和<future>。

  • <atomic>:该头文主要声明了两个类, std::atomic 和 std::atomic_flag,另外还声明了一套 C 风格的原子类型和与 C 兼容的原子操作的函数。
  • <thread>:该头文件主要声明了 std::thread 类,另外 std::this_thread 命名空间也在该头文件中。
  • <mutex>:该头文件主要声明了与互斥量(mutex)相关的类,包括 std::mutex 系列类,std::lock_guard, std::unique_lock, 以及其他的类型和函数。
  • <condition_variable>:该头文件主要声明了与条件变量相关的类,包括 std::condition_variable 和 std::condition_variable_any。
  • <future>:该头文件主要声明了 std::promise, std::package_task 两个 Provider 类,以及 std::future 和 std::shared_future 两个 Future 类,另外还有一些与之相关的类型和函数,std::async() 函数就声明在此头文件中。

3、初识线程

复制代码
#include <iostream>
#include <thread>
using std::thread;
using std::cout;
using std::endl;
int k = 0;
void fun() {
    //线程休眠,seconds(5)表示子线程休眠5秒,chrono是c++11的时间相关库。
    std::this_thread::sleep_for(std::chrono::seconds(5));
    for (int i = 0;i < 10;++i) {
        cout << "hello world" << endl;
        k++;
    }
}
/**********************************************************************
注意:
2.主线程函数不能提前结束于新创建的线程函数,因为在c++11中,线程也是对象,
主函数结束线程对象即销毁。
3.t.join()是主函数阻塞等待线程结束才能结束,主函数会继续执行,并阻塞在return处,
t.detach()主函数和线程函数分离,各自执行各自的,线程变为后台线程。
4.可通过bind和lambda创建线程可以将线程保存在容器中,以保证线程对象的声明周期。
但是注意线程没有拷贝构造函数,有移动构造函数。 
***********************************************************************/
int main(int argc,char *argv[]) {
    //创建线程对象
    thread t1(fun);
    //获得线程ID和CPU核数
    cout << "ID:" << t1.get_id() << endl;
    cout << "CPU:" << thread::hardware_concurrency() << endl;
    //主函数阻塞等待线程结束
    t1.join();
    cout << k << endl;
    system("pause");
    return EXIT_SUCCESS;
}

4、thread类:

5、std::thread构造:

(1). 默认构造函数,创建一个空的 thread 执行对象。

(2). 初始化构造函数,创建一个 thread对象,该 thread对象可被 joinable,新产生的线程会调用 fn 函数,该函数的参数由 args 给出。

(3). 拷贝构造函数(被禁用),意味着 thread 不可被拷贝构造。

(4). move 构造函数,move 构造函数,调用成功之后 x 不代表任何 thread 执行对象。

注意:可被 joinable 的 thread 对象必须在他们销毁之前被主线程 join 或者将其设置为 detached.

6、多线程的优势:

  • 提高应用程序的响应速度:相比单线程程序,多线程程序不必等待其他线程完成就可以开始另一个线程。
  • 有效使用多处理器,提高CPU利用率:多线程程序能很好的使用多处理器,提高运行速度。
  • 节省系统资源: 处理同步任务时,使用两个线程比使用两个进程节省大量的系统资源。
相关推荐
木心月转码ing35 分钟前
Hot100-Day24-T128最长连续序列
算法
小肥柴42 分钟前
A2UI:面向 Agent 的声明式 UI 协议(三):相关概念和技术架构
算法
Lupino3 小时前
我把 OpenClaw 装到服务器上后,才明白它真正该装在哪里(实战复盘)
运维
学高数就犯困3 小时前
性能优化:LRU缓存(清晰易懂带图解)
算法
蝎子莱莱爱打怪4 小时前
ESXi 强制断电后恢复CentOS7虚拟机避坑指南:解决重复注册&目录清理难题
linux·后端·程序员
xlp666hub5 小时前
Leetcode第七题:用C++解决接雨水问题
c++·leetcode
CoovallyAIHub6 小时前
CVPR 2026 | MixerCSeg:仅2.05 GFLOPs刷新四大裂缝分割基准!解耦Mamba隐式注意力,CNN+Transformer+Mamba三
深度学习·算法·计算机视觉
CoovallyAIHub6 小时前
YOLO26-Pose 深度解读:端到端架构重新设计,姿态估计凭什么跨代领先?
深度学习·算法·计算机视觉
CoovallyAIHub7 小时前
化工厂气体泄漏怎么用AI检测?30张图3D重建气体泄漏场景——美国国家实验室NeRF新研究
深度学习·算法·计算机视觉
肆忆_7 小时前
实战复盘:手写 C++ 虚拟机的高性能并行 GC (Thread Pool + Work Stealing)
c++