一些读书随笔(2)

来源:互联网 发布:网络球型摄像机 编辑:程序博客网 时间:2024/05/16 17:42

1. 多个人做一件事情的时候,可能需要同步。如果不考虑执行顺序的情况下,每次得到的结果一样的,那么无需同步,但是,如果按照不同的执行顺序,得到不同的结果,而且其中只有部分结果是正确的,那么需要同步。如食堂排队,打饭员每次只能为一个人打饭打菜,如果一次为多个人打饭打菜可能会乱,这是不希望看到的,所以同步的办法是排队。从程序的角度分析,打饭员是临界资源,每次只能为一个人服务。在多线程环境下,用互斥锁实现,只有拿到互斥锁的线程,才能够访问临界区代码,访问完之后,需要释放互斥锁。研究互斥同步比较的好的方法是,熟悉生产者和消费者问题。

2. 书中说明三种生产者消费者模型,第一种情况,多个生产者生产完成之后,再启动消费者消费,这种情况下,只需要同步生产者,只要一个生产互斥锁;第二种情况,生产者和消费者同步进行,但是消费者在无数据的情况下,需要等待生产者生产,消费者等待是属于轮询,对CPU造成一定的浪费,消费者使用生产者互斥锁。第三种情况与第二种情况相同,只是通过信号来实现生产者与消费者之间的同步。需要生产者互斥锁,消费者互斥锁,外加消费者条件变量。生产完成后,通知消费者消费,唤醒正在等待的消费者。消费者在等待时候调用pthread_cond_wait进入睡眠。书中描述了给条件变量发送信号的代码框架,摘录如下:

struct{  pthread_mutex_t mutex;  pthread_cond_t cond; 维护本条件的各个变量} val = {PTHREAD_MUTEX_INITIALIZER,PTHREAD_COND_INITIALIZER,...};pthread_mutex_lock(&val.mutex);设置条件为真;pthread_cond_signal(&val.cond);pthread_mutex_unlock(&val.mutex);

书中维护条件变量为计数器,测试条件并进入睡眠用于等待条件为真的代码大体如下:

pthread_mutex_lock(&val.mutex);while(条件为真)     pthread_cond_wait(&val.cond,&val.mutex);修改条件;pthread_mutex_unlock(&val.mutex);

为什么加while循环呢,当pthread_cond_wait返回时,我总是再次测试相应的条件是否成立,因为可能发生虚假的唤醒:期待条件尚不成立的唤醒。


3. 当进程持有锁期间终止,系统是如何处理的? 一种情况有系统来清理进程所包含的锁,另一种是需要自己安装退出时需要清理的锁。不过这种情况需要异常的小心,不能指望系统。




原创粉丝点击