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、线程同步总结