线程同步:信号量、互斥锁、条件变量
系统调度其实是调用线程创建的函数
谈进程:
3.7.1. 再论进程
7.1.1、多进程实现同时读取键盘和鼠标
使用进程技术的优势:
(1)CPU分时复用,单核心CPU可以实现宏观上的并行,微观上的串行
(2)实现多任务系统需求(多任务的需求是客观的)
7.1.3、进程技术的劣势:
(1)进程间切换开销大
(2)进程间通信麻烦而且效率低
7.1.4、解决方案就是线程技术
(1)线程技术保留了进程技术实现多任务的特性
(2)线程的改进就是在线程间切换和线程间通信上提升了效率
(3)多线程在多核心CPU上面更有优势
3.7.2.线程的引入
3.7.2.1、使用线程技术同时读取键盘和鼠标
3.7.2.2、1inux中的线程简介
(1)一种轻量级进程
(2)线程是参与内核调度的最小单元
(3)一个进程中可以有多个线程
3.7.2.3、线程技术的优势
(1)像进程一样可被OS调度
(2)同一进程的多个线程之间很容易高效率通信
(3)在多核心CPU(对称多处理器架构)架构下效率最大化
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 退出,正常范围使用 pthread_exit
(2) pthread_cleanup push 压入
(3) pthread_cleanup pop 弹出
3.7.3.4、获取线程id
(1)pthread_self
锁举例:
int cnt = 0;
if(cnt ==0)
{
cnt++;
pthread_cleanup_push(function,arg);
//子线程操作
//子线程在这里有可能被主线程cannel(取消)
cnt--;
}
void function(void *arg)
{
cnt--;//在被调用的时候将锁已经打开,提前被线程取消
}
3.7.6.线程同步之互斥锁
3.7.6.1、什么是互斥锁
(1)互斥锁又叫互斥量( mutex)
(2)相关函数: pthread_mutex_init //初始化锁
pthread_mutex_destroy //取消锁
pthread_mutex_lock //上锁
pthread_mutex_unlock //解锁
(3)互斥锁和信号量的关系:可以认为互斥锁是一种一种特殊的信号量
(4)互斥锁主要用来实现关键段保护
7.6.2、用互斥锁来实现上节的代码
线程同步之条件变量:
什么是条件变量
相关函数
pthread_cond_init pthread_cond_destory
pthread_cond_wait pthread_cond_signal/pthread_cond_brocast
使用条件变量来实现上节点代码
线程同步总结