互斥#########################
中断屏蔽***********************************
因为不能屏蔽其他CPU的中断,因此不能解决SMP多CPU引发的竞态,因为其他CPU也会引发竞争。
因此,单独使用中断屏蔽通常不是一种值得推荐的避免竞态的方法(换句话说,驱动中使用local_irq_disable/enable()通常意味着一个bug),它适合与下文将要介绍的自旋锁联合使用。
原子变量和原子位操作***********************************
优点:简单
缺点:只能实现对变量这种资源进行互斥,不能对其他类型的资源进行互斥。
自旋锁***********************************
自旋锁只有在内核可抢占或SMP(多处理器)的情况下才真正需要,在单CPU且不可抢占的内核下,自旋锁的所有操作都是空操作。
不是说在单CPU且不可抢占的内核下不可以用自旋锁,而是在同一时间内,没有其他程序跟你竞争临界资源,就算使用了自旋锁也无意义。
读写锁***********************************
顺序锁***********************************
读操作要读两次,如果两次相等就会就不会继续读,不相等就继续读。
信号量***********************************
优点:可以睡眠
缺点:如果没有获得信号量,马上睡眠,从睡眠到唤醒的时间段过长,不适合等待时间较短的程序。
互斥量:
优点:可以睡眠
缺点:暂时先等待一小段时间,如果没有获得互斥量再睡眠,这样更高效。
RCU机制
优点:适合对链表的操作,适合读多写少
缺点:由于有宽限期,所以等待所有的读结束需要时间
同步#########################
完成量:***********************************
适用于线程同步
条件变量:***********************************
条件变量其实是用于实现生产者和消费者的问题
消费者线程启动,获取互斥量读缓冲区,发现为空,阻塞自己并同时释放互斥量;生产者线程启动,获取互斥量写缓冲区,写完毕后,通知消费者同时释放互斥量;消费者线程唤醒,获取互斥量读缓冲区;
优点:可以实现生产者和消费者机制
缺点:要和互斥锁共同实现
应用层的同步总结:***********************************
互斥量:
优点:
1.适用于线程间的的读写会发生交互的情况
2.一旦互斥锁,上锁了,所有其他使用该锁的线程,都阻塞
缺点:
1.有可能发生死锁
2.锁解除了,不能及时通知其他线程
/*********************************************************************/
读写锁:
优点:
1.可以分读 锁和 写 锁,
2.可以用于,有些线程只读不写,或者只写不读的情况
3.可以最大效率的利用共享资源
缺点:
1.按照规则加上 读 锁后的线程,只应该进行 读 操作,但是我可以读也可以写,这回造成一些问题
2.读写锁会抛锚,有时能限制,有时不能限制,抛锚率 百分之三十
/*********************************************************************/
条件变量:
优点:
1.可以通知所有等待条件变量的线程,比互斥量效率高
2.完美解决了,互斥量要通过循环来判断,是否可以进行上锁操作,不浪费CPU
缺点:
1.需要互斥量结合,不能单独使用
******************************************************************/
自旋锁:
优点:
1.可以一直判断锁的情况,可以及时的上锁
2.可以用在非常需要最开的到所得情况
缺点:
1.由于,没有得到自旋锁的进程会不断循环检测锁,因此上了锁的进程要以最快的速度做完事情,
2.这也就限制了,这种锁不应该用在占用时间的多的进程
3.反应太快,使得它不适用于进行全局变量的读和写
/*********************************************************************/
屏障:
优点:
1.可以用于多个线程完成一个大的任务的情况
缺点:
1.只要一个线程没完成任务,其他线程都不能继续操作
标签:阻塞,间通信,互斥,优点,线程,缺点,自旋,CPU From: https://blog.51cto.com/u_13267193/5928639