互斥锁,信号量和条件变量的实现
这几天看了不少资料,这里做一个简单的总结归纳:
几个不错的网站:
线程的三个主要同步原语:互斥锁,信号量和条件变量,一下简称mutex,sem,cond。
- 其中mutex和sem都是对应futex进行了简单的封装,在不存在冲突的情况下就不用陷入到内核
中进行仲裁。而且pthread_join也是借助futex来实现的。而详见
- cond则是依靠mutex和信号来实现其语意,也就是说信号存在丢失的情况。sem是随内核持续的。
- 读写锁的自旋实现是指一直忙等待一个变量的可用,虽然消耗处理器,但是没有阻塞唤醒的代价。
唤醒丢失往往会在下面的情况下发生:
-
一个线程调用pthread_cond_signal或pthread_cond_broadcast函数;
-
另一个线程正处在测试条件变量和调用pthread_cond_wait函数之间;
-
没有线程正在处在阻塞等待的状态下。