学懂C++(二十二):高级教程——深入理解 C++ 多线程基础理论和概念

       

目录

1、线程与进程

进程

线程

区别与联系

2、并发与并行

并发

并行

3、线程的生命周期

创建(Create)

就绪(Ready)

运行(Running)

等待(Blocked/Waiting)

完成(Terminated)

4、线程调度

调度方式

线程优先级

5、线程调度示例

C++ 标准库

Windows API


 在现代软件开发中,多线程编程是一个非常重要的领域。它允许程序在同一时间内执行多个任务,从而提高程序的效率和响应性。本文将深入探讨 C++ 多线程的基础理论和概念,并通过实例代码更好地理解和掌握这些知识。

1、线程与进程

进程

定义: 进程是一个运行中的程序实例,包括程序代码、数据、进程控制块(PCB)等。

特征: 1、进程拥有独立的内存空间,相互之间不能直接访问内存。

             2、进程间通讯 (IPC) 方法包括管道、消息队列、共享内存等。

开销: 创建、销毁进程和进程间切换的开销较大。

线程

定义: 线程是进程中的一个执行单元,一个进程可以包含多个线程。线程拥有独立的栈和寄存器,但共享进程的堆和全局变量

特征: 线程之间可以直接共享数据,这使得线程间通信更高效,但也带来了数据竞争问题。

开销: 线程的创建、销毁和线程间切换开销较小于进程。

区别与联系

区别: 

      1. 进程有独立的内存空间,线程共享进程的内存空间。

       2. 进程间通讯复杂且开销大,线程间通讯简单但需要注意同步。

联系: 线程是进程的一部分,一个进程至少有一个主线程,多个线程可以并发执行。

2、并发与并行

并发

定义: 在单个处理器上,通过时间片轮转,实现多个任务在同一时间段内交替执行。目的是提高程序的响应性。

应用场景: 服务器处理多个客户端请求,图形界面程序响应用户操作。

并行

定义: 在多处理器或多核系统上,同时执行多个任务。目的是提高程序的执行效率。

应用场景: 计算密集型任务分布到多个核上并行计算,如图像处理、科学计算。

3、线程的生命周期

创建(Create)

通过调用 std::thread 构造函数或 Windows API CreateThread 创建新线程。新线程进入可执行状态。

就绪(Ready)

线程已经准备好执行,等待 CPU 调度。处于就绪队列中。

运行(Running)

线程获得 CPU 时间片开始执行。执行完时间片后进入就绪或等待状态。

等待(Blocked/Waiting)

线程等待某个条件或事件发生,如等待 I/O 操作完成、等待互斥量、条件变量等。等待事件发生后,重新进入就绪状态。

完成(Terminated)

线程的任务执行完毕或被终止。线程退出并释放资源。

4、线程调度

调度方式

  • 先来先服务 (FCFS): 按线程到达顺序调度。
  • 时间片轮转 (Round-Robin): 每个线程分配固定的时间片,时间片用完后切换到下一个线程。
  • 优先级调度: 按线程优先级调度,高优先级线程优先执行。

线程优先级

定义: 每个线程分配一个优先级,优先级高的线程获得更多的 CPU 时间。

设置方法:

  • 使用标准库: C++ 标准库没有直接提供设置线程优先级的接口,可以通过操作系统 API 实现。
  • Windows API: SetThreadPriority 函数设置线程优先级。

线程优先级的影响:

  • 高优先级线程可以优先获得 CPU 时间,低优先级线程可能长时间得不到执行。
  • 不当的优先级设置可能导致优先级反转问题,即低优先级线程持有高优先级线程需要的资源,导致高优先级线程长时间等待。

5、线程调度示例

C++ 标准库

#include <iostream>
#include <thread>

// 线程函数
void threadFunction() {
    std::cout << "Thread is running!" << std::endl;
}

int main() {
    // 创建线程
    std::thread t(threadFunction);
    
    // 等待线程完成
    t.join();
    
    return 0;
}

Windows API

#include <windows.h>
#include <iostream>

// 线程函数
DWORD WINAPI ThreadFunction(LPVOID lpParam) {
    std::cout << "Thread is running!" << std::endl;
    return 0;
}

int main() {
    // 创建线程
    HANDLE hThread = CreateThread(
        NULL,              // 默认安全属性
        0,                 // 默认堆栈大小
        ThreadFunction,    // 线程函数
        NULL,              // 线程函数参数
        0,                 // 默认创建标志
        NULL               // 获取线程ID
    );
    
    // 等待线程完成
    WaitForSingleObject(hThread, INFINITE);
    
    // 关闭线程句柄
    CloseHandle(hThread);
    
    return 0;
}

        通过理解和掌握这些基础理论和概念,可以为深入学习和实践 C++ 多线程编程奠定坚实的基础。希望本文能帮助读者更好地理解和应用多线程编程技术。

上一篇:学懂C++ (二十一):高级教程——深入C++多线程开发详解 

下一篇:学懂C++(二十三):高级教程——深入详解C++ 标准库的多线程支持 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猿享天开

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值