Linux 多线程编程

一. 线程概述
1.线程是进程(进程是一个具有一定独立功能的程序的一次运行,是资源分配的最小单元)的一个实体,是CPU调度和分派的基本单位,他是比进程更小的能独立运行的基本单位。线程基本上不拥有系统资源,他可以与同属于一个进程的其他线程共享进程全部资源。

2.为什么有了进程之后还要引入线程呢?
(1)多进程模型是具有不同的地址空间,具有并行性,互不干扰等特点;而多线程模型共享同一个地址空间和所有可用数据的能力
(2)线程比进程更轻量级,他们更容易更快创建和撤销
(3)在一些需要大量I/O处理和大量计算的情况下,拥有多线程允许这些活动彼此重叠进行
(4)最后,在多CPU也就是多核系统中,可以真正实现多线程并行允许
(5)线程概念试图实现的是:共享一组资源的多个线程的执行能力

3.多线程的优点
(1)使程序的响应速度更快,因为用户界面可以在进行其他工作的同时一直处于活动状态
(2)“节俭”,线程间彼此切换时间远远小于进程切换时间
(3)线程间方便的通信机制,线程共享数据空间,所以一个线程的数据可以直接为其他线程所用
(4)使多cpu更加有效,操作系统会保证在线程数不大于cpu数时,不同的线程运行于不同的cpu
(5)改善程序结构
(6)以下情况中最适合采用多线程处理:耗时或大量占用处理器的任务阻塞用户界面操作、各个任务必须等待外部资源(如远程文件或Internet连接)

4.多线程的缺点
(1)对线程管理要求额外的CPU开销
(2)线程的死锁

二 .多线程的实现
1.编写Linux下的多线程程序,涉及的多线程开发概念主要包含线程、互斥锁、条件;需要使用头文件pthread.h,因为pthread的库不是linux系统的库,所以编译时需要加上-lpthread

2.pthread_create函数:创建线程,默认属性非分离

3.pthread_exit函数:终止线程
(1)退出线程所占用的资源并不会随着线程的终止而得到释放,但是可以用pthread_join等待函数来同步并释放资源
(2)线程退出的方式有三种
1)线程从执行函数返回,返回值是线程的退出码
2)线程被同一进程的其他线程取消:pthread_cancel(线程号):取消指定线程,由于线程的属性,取消线程不是立即取消,而是到取消点取消,阻塞函数(sleep)就是取消点,但是我们可以通过函数修改线程的属性;pthread_setcanceltype:可设置线程为立即取消pthread_setcancelstate:可设置线程为不可取消
3)调用pthred_exit()函数退出
(3)调用exit()会终止整个进程
(4)如果主线程仅仅调用了pthread_exit,则仅主线程本身终止

4.pthread_join函数:等待线程结束、回收线程资源
(1)指定的线程必须位于当前的进程中,而且不能是分离线程
(2)如果多个线程等待同一个线程终止,则所有等待线程将一直等到目标线程终止,然后,一个等待线程成功返回,其余的等待线程将失败并返回ESRCH错误
(3)线程运行结束后,会释放自己独有的空间资源
(4)如果线程是非分离的,线程会保留线程ID号,需要其他线程通过join,来确认这个线程死亡;如果线程是分离的,线程自己运行结束,就会释放所有资源
(5)使用jion的线程将会阻塞

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
注意事项:线程函数的参数类型为void,所以到函数里不要忘记需要转换*

5.pthread_detach(pthread_self():获取线程号)
(1)线程运行结束后,自动释放资源
(2)如果设置一个线程为分离线程,而这个线程运行非常快,他很可能在pthread_create函数返回之前就终止了,所以设置一段等待时间,是在多线程编程里常用的方法;但是注意不要用wait()之类的函数,他们是使整个进程睡眠
在这里插入图片描述
例二:多线程实现消息队列的互相发送(比多进程方便)下面只写消息队列创建端
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三.线程同步机制
1.进行多线程编程,因为不知道哪个线程会在什么时候对共享资源操作,所以我们可以使用保护措施:互斥锁Mutex、信号灯Semaphore、条件变量Conditions
2.互斥锁Mutex
(1)pthread_mutex_t mutex:互斥量定义
(2)pthread_mutex_init:互斥量初始化
(3)pthread_mutex_destroy:互斥量销毁
(4)pthread_mutex_lock:上锁
(5)pthread_mutex_unlock:解锁
(6)简单来说,互斥锁用于限制同一时刻,其他的线程执行pthread_mutex_lock和pthread_mutex_unlock之间的指令

例三:实现多线程卖票(加上互斥量做保护)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
3.条件变量Conditions
(1)互斥锁一个明显的缺点是它只有两种状态:锁定和非锁定;当多个线程访问同一个共享资源时,并不知道何时应该使用共享资源,这是加入条件变量,条件变量通过允许线程阻塞和等待另一个线程发送信号的方法弥补了互斥锁的不足
(2)pthread_cond_t cond :定义条件变量
(3)pthread_cond_wait:等待
(4)pthread_cond_signal:收信号

例四:实现前五十张票A线程来卖,后五十张票AB线程一起卖
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值