Linux C/C++ 多线程开发 - 基础介绍

Linux C/C++ 多线程开发 - 基础介绍

线程的基本概念

​ 在我们目前的现代操作系统大多数支持多线程的概念,每个进程中至少有一个线程,所以即使没有使用多线程编程技术,进程也含有一个主线程。也就是说,CPU中执行的是线程,线程是程序的最小执行单位,是操作系统分配CPU时间的最小实体。

​ 一个线程的执行是由主线程开始的,如果需要可以在程序的任何地方开辟新的线程,其他线程都是由主线程创建。

线程和进程的关系

​ 线程是属于进程的,线程运行在进程空间内,同一进程所产生的线程共享同一内存空间,当进程退出时该进程所产生的线程都会被强制退出并清除。

​ 线程可与属于同一进程的其他线程共享进程所拥有的全部资源,但是其本身基本不拥有系统资源,只拥有一点在运行中必不可少的信息(如程序计数器,一组寄存器和线程栈,线程栈用于维护线程在执行代码时所需要的所有函数参数和局部变量)。

引入线程的好处
  1. 在进程内创建,终止线程比创建,终止进程要快
  2. 同一进程内的线程间切换比进程间的切换要快,尤其是用户级线程间的切换
  3. 每个进程具有独立的地址空间,而该进程内的所有线程共享该地址空间,因此可以解决父子进程模型中子进程必须复制父进程地址空间的问题
  4. 线程对解决客户/服务器模型非常有效
使用多线程的情况
  1. 应用程序中的各任务相对独立
  2. 某些任务耗时较多
  3. 各任务有不同的优先级
  4. 一些实时系统应用

注:一个进程中的所有线程共享它们父进程的变量,但同时每个线程可以拥有自己的变量

线程的状态

​ 一个线程从创建到结束,是一整个生命周期,它总是处于下面4个状态中的一个:

(1)就绪态

​ 线程能够运行的条件已经满足,只是在等待处理器的调度(处理器要根据调度策略来把就绪态的线程调度到处理器中运行)

(2)运行态

​ 运行态表示线程正在处理器中运行,正占用着处理器

(3)阻塞态

​ 由于在等待处理群之外的其他条件而无法运行的状态叫作阻塞态。这里的其他条件包括I/O操作,互斥锁的释放,条件变量的改变等

(4)终止态

​ 终止态就是线程的线程函数运行结束或被其他线程取消后处于的状态。线程处于终止态后应该及时进行资源回收

线程标识

​ 句柄是用来标识线程对象的,而线程本身用ID来标识。在创建线程的时候,系统会为线程分配一个唯一的ID作为线程的标识,这个ID从线程创建开始存在,一直伴随着线程的结束才消失。通常线程创建成功后会返回一个线程ID。

多线程开发的两种方式

​ 在Linux C/C++开发环境中,通常有两种方式来开发多线程程序,一种是利用POSIX多线程API函数来开发多线程程序,另外一种是利用C++自带线程类来开发多线程程序。

Linux多线程开发
  • 利用POSIX多线程API函数
  • 利用C++自带线程类
POSIX多线程API函数

常见的与线程有关的基本API函数

API函数含 义
pthread_create创建线程
pthread_exit线程终止自身执行
pthread_join等待一个线程的结束
pthread_self获取线程ID
pthread_cancel取消另一个线程
pthread_exit在线程函数中调用来退出线程函数
pthread_kill向线程发送一个信号

注:使用这些API函数,需要包含头文件pthread.h,并且在编译的时候需要加上库pthread,表示包含多线程库文件

C++11中的线程类

​ C++11新标准中引入了5个头文件来支持多线程编程,分别是atomic, thread, mutex, condition_variablefuture

  • **atomc: **该头文件主要声明了两个类,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函数就声明在该头文件中

类std::thread的常用成员函数

成员函数说明(public 访问方式)
thread构造函数,有4种构造函数
get_id获得线程ID
joinable判断线程对象是否可连接的
join等待线程结束,该函数是阻塞函数
native_handle用于获得与操作系统相关的原生线程句柄(需要本地库支持)
swap线程交换
detach分离线程
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值