天天看点

3.7.linux线程全解

3.7.1.再论进程

3.7.1.1、多进程实现同时读取键盘和鼠标

3.7.1.2、使用进程技术的优势

(1)CPU时分复用,单核心CPU可以实现宏观上的并行

(2)实现多任务系统需求(多任务的需求是客观的)

3.7.1.3、进程技术的劣势

(1)进程间切换开销大

(2)进程间通信麻烦而且效率低

3.7.1.4、解决方案就是线程技术

(1)线程技术保留了进程技术实现多任务的特性。

(2)线程的改进就是在线程间切换和线程间通信上提升了效率。

(3)多线程在多核心CPU上面更有优势。

3.7.2.线程的引入

3.7.2.1、使用线程技术同时读取键盘和鼠标

gcc 3.7.2.c -lpthread //这样编译

3.7.2.2、linux中的线程简介

(1)一种轻量级进程

(2)线程是参与内核调度的最小单元

(3)一个进程中可以有多个线程

3.7.2.3、线程技术的优势

(1)像进程一样可被OS调度

(2)同一进程的多个线程之间很容易高效率通信

(3)在多核心CPU(对称多处理器架构SMP)架构下效率最大化

3.7.3.线程常见函数

3.7.3.1、线程创建与回收

(1)pthread_create 主线程用来创造子线程的

(2)pthread_join 主线程用来等待(阻塞)回收子线程

(3)pthread_detach 主线程用来分离子线程,分离后主线程不必再去回收子线程

3.7.3.2、线程取消

(1)pthread_cancel 一般都是主线程调用该函数去取消(让它赶紧死)子线程

(2)pthread_setcancelstate 子线程设置自己是否允许被取消

(3)pthread_setcanceltype

3.7.3.3、线程函数退出相关

(1)pthread_exit与return退出

(2)pthread_cleanup_push

(3)pthread_cleanup_pop

3.7.3.4、获取线程id

(1)pthread_self

3.7.4.线程同步之信号量1

3.7.4_5.线程同步之信号量12

3.7.4.1、任务:用户从终端输入任意字符然后统计个数显示,输入end则结束

3.7.4.2、使用多线程实现:主线程获取用户输入并判断是否退出,子线程计数

(1)为什么需要多线程实现

(2)问题和困难点是?

(3)理解什么是线程同步

参考:

3.7.4.3、信号量的介绍和使用

3.7.5.线程同步之信号量2

使用​​-lpthread和-pthread的区别​​

3.7.6.线程同步之互斥锁

3.7.6.1、什么是互斥锁

(1)互斥锁又叫互斥量(mutex)

(2)相关函数:pthread_mutex_init pthread_mutex_destroy

pthread_mutex_lock pthread_mutex_unlock

(3)互斥锁和信号量的关系:可以认为互斥锁是一种特殊的信号量

(4)互斥锁主要用来实现关键段保护

3.7.6.2、用互斥锁来实现上节的代码

互斥锁:我把它比作厕所的门,只能一个人使用CPU,如果不设置一些机制如(延时),就会一个人上完厕所,然后又去上厕所,其他人因为没又抢到厕所,就一直没法上厕所,所以因为这个缺点,互斥锁不适合如while这样一直需要上厕所的程序

2.不管你延时时间是长还是短,都无法预知下一个是谁抢到厕所

注意:man 3 pthread_mutex_init时提示找不到函数,说明你没有安装pthread相关的man手册。安装方法:1、虚拟机上网;2、sudo apt-get install manpages-posix-dev

3.7.7.线程同步之条件变量

3.7.7.1、什么是条件变量

互斥锁和信号量都不是线程独有的

条件变量是线程独有的

3.7.7.2、相关函数

pthread_cond_init pthread_cond_destroy

pthread_cond_wait pthread_cond_signal/pthread_cond_broadcast

pthread_cond_timedwait

3.7.7.3、使用条件变量来实现上节代码

3.7.7.4、线程同步总结

继续阅读