pthread_cond_wait 先解锁mut,等待cond,等cond信号来,mut上锁(注意如果其他线程中对mut加锁了,则不会返回,等待其他进程释放mut(可以把下面测试代码thr_fun2第39行代码 pthread_mutex_unlock(&mut);去掉测试下,线程虽然信号cond等到了但不会返回)) 。
pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)函数传入的参数mutex用于保护条件,因为我们在调用pthread_cond_wait时,如果条件不成立,我们就进入阻塞,但是进入阻塞期间,如果条件变量改变了的话,我们就漏掉了这个条件。因为这个线程还没有放到等待队列上,所以调用pthread_cond_wait前要先锁互斥量,即调用pthread_mutex_lock(), pthread_cond_wait在把线程放进阻塞队列后,自动对mutex进行解锁(它内部有自己维护一个队列),使得其他线程可以获得加锁的权利。这样其它线程才能对临界资源进行访问并在适当的时候唤醒这个阻塞的进程。当pthread_cond_wait返回的时候又会自动给mutex加锁,所以最后需要一个pthread_mutex_unlock()函数来解锁。
pthread_cond_signal
pthread_cond_signal(pthread_cond_t *cond)函数是用来在条件满足时,给正在等待的对象发送信息,表示唤醒该变量,一般和pthread_cond_wait函数联合使用,当它接收到signal发来的信号后,就再次锁住mutex,一旦pthread_cond_wait锁定了互斥对象,那么它将返回并允许wait的线程继续执行。
-
#include<stdio.h>
-
#include<stdlib.h>
-
#include<signal.h>
-
#include<pthread.h>
-
-
int x=1,y=2;
-
pthread_mutex_t mut=PTHREAD_MUTEX_INITIALIZER;
-
pthread_cond_t cond=PTHREAD_COND_INITIALIZER;
-
-
-
void * thr_fun1(void *arg)
-
{
-
-
pthread_mutex_lock(&mut);
-
printf("1 lock\n");
-
while (1) {
-
printf("x<=y while\n");
-
-
pthread_cond_wait(&cond, &mut);
-
printf("x<=y end\n");
-
}
-
/* operate on x and y */
-
printf("pth1 x<=y\n");
-
pthread_mutex_unlock(&mut);
-
}
-
-
-
void * thr_fun2(void *arg)
-
{
-
-
pthread_mutex_lock(&mut);
-
-
printf("2 lock\n");
-
-
while (1) {
-
pthread_cond_signal(&cond);
-
sleep(2);
-
printf("x>y while end\n");
-
pthread_mutex_unlock(&mut);
-
}
-
-
printf("x>y while\n");
-
pthread_cond_signal(&cond);
-
printf("x>y while end\n");
-
-
// }
-
-
/* operate on x and y */
-
x=1;
-
y=4;
-
printf("pth2 x>y\n");
-
pthread_mutex_unlock(&mut);
-
}
-
-
int main()
-
{
-
int err;
-
pthread_t tid1;
-
pthread_t tid2;
-
-
-
pthread_create(&tid1,NULL,thr_fun1,0);
-
pthread_create(&tid2,NULL,thr_fun2,0);
-
-
while(1)
-
{
-
;
-
}
-
exit(0);
-
}
阅读(1223) | 评论(0) | 转发(1) |