一、实现线程间同步互斥的操作
1、线程间同步====有序执行法1、多个信号量
法2、条件变量+互斥锁===broadcastsignal
2、线程间互斥====你死我活法1、单个信号量
法2、互斥锁
//1、互斥是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。//2、同步是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。//3、同步其实已经实现了互斥,所以同步是一种更为复杂的互斥。//4、互斥是一种特殊的同步。
二、为什么要实现同步互斥
保护临界资源
即全局变量
pthread_create之前的成为全局资源=====当有线程操作全局资源的时候===变为临界资源
三、代码示例
1、多个线程实现同步,定义多个信号量
同步是在互斥的基础上实现有序。
2、互斥锁实现线程互斥
同步是在互斥的基础上实现有序。
互斥是一种特殊的同步
3、互斥锁+条件变量实现同步互斥
1)mutex+pthread_cond+pthread_cond_broadcast
//pthread_cond_wait()用于阻塞当前线程,等待别的线程使用pthread_cond_signal()或pthread_cond_broadcast来唤醒它。//pthread_cond_wait()必须与pthread_mutex配套使用。pthread_cond_wait()函数一进入wait状态就会自动releasemutex。//当其他线程通过pthread_cond_signal()或pthread_cond_broadcast,把该线程唤醒,使pthread_cond_wait()通过(返回)时,该线程又自动获得该mutex。
当有多个线程时,使用pthread_cond_broadcast会唤醒所有阻塞的线程,因此不能高效保证其同步性。
2)mutex+pthread_cond+pthread_cond_signal
//pthread_cond_signal函数的作用是发送一个信号给另外一个正在处于阻塞等待状态的线程,使其脱离阻塞状,继续执行//.如果没有线程处在阻塞等待状,pthread_cond_signal也会成功返回。//pthread_cond_signal只给一个线程发信号。//假如有多个线程正在阻塞等待着这个条件变量的话,那么是根据各等待线程优先级的高低确定哪个线程接收到信号开始继续执行。//如果各线程优先级相同,则根据等待时间的长短来确定哪个线程获得信号。
先将pthread_cond_signal注释掉,看看会有什么现象
两个线程都发送阻塞进入了睡眠,
疑问:创建线程时,线程运行进入阻塞,为什么代码能接着运行,而不是阻塞在阻塞处,不像下执行。
原因:在线程进入阻塞后,会自动释放CPU控制权,进入阻塞。只有当中断发生时,才会使线程从阻塞中跳出,即pthread_cond_signal唤醒阻塞线程
使用pthread_cond_signal唤醒指定的条件阻塞线程