1.可以通过互斥量+信号量的形式以及互斥量+条件变量的形式实现。
2.实现互斥的P操作一定要在实现同步的P操作之后。 V操作不会导致进程阻塞,因此两个V操作顺序可以交换。
同时,我们发现,当互斥量与条件变量配合使用的时候,则是互斥量在前,pthread_cond_wait()在后,这是因为,pthread_cond_wait()函数是个原子操作,如出现阻塞,则会先将互斥量解锁,不会出现死锁的情况。
3.PV操作的解题思路:
关系分析。找出题目中描述的各个进程,分析它们之间的同步、互斥关系。
整理思路。根据各进程的操作流程确定P、V操作的大致顺序。
设置信号量。设置需要的信号量,并根据题目条件确定信号量初值。(互斥信号量初值一般为1,同步信号量的初始值要看对应资源的初始值是多少)
4.假醒
使用while而不是if,这仍然是因为pthread_cond_wait会京mutex解锁原因,判断这个时候,是否有其他同类线程已经“捷足先登”了,导致又没资源了。
while( !spaces ) { // 避免“惊群”效应,避免因其他线程实现得到事件而导致该线程“假醒”
pthread_cond_wait( ¬full, &mutex );
}
5.phtread_cond_wait是阻塞等待,也就是说,如果没有pthread_cond_signal唤醒他,他就会一直在阻塞。
void *function1()
{
while(1)
{
pthread_mutex_lock(&lock);
printf("===== 线程1进入睡眠 ====\n");
pthread_cond_wait(&cond,&lock);
printf("==== 线程1 唤醒 ====\n");
pthread_mutex_unlock(&lock);
}
}