Chinaunix首页 | 论坛 | 博客
  • 博客访问: 478206
  • 博文数量: 144
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1190
  • 用 户 组: 普通用户
  • 注册时间: 2013-10-08 20:16
文章分类

全部博文(144)

文章存档

2017年(1)

2015年(5)

2014年(108)

2013年(30)

我的朋友

分类: LINUX

2014-08-21 10:48:13

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的线程继续执行。

点击(此处)折叠或打开

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<signal.h>
  4. #include<pthread.h>

  5. int x=1,y=2;
  6. pthread_mutex_t mut=PTHREAD_MUTEX_INITIALIZER;
  7. pthread_cond_t cond=PTHREAD_COND_INITIALIZER;


  8. void * thr_fun1(void *arg)
  9. {

  10.          pthread_mutex_lock(&mut);
  11.          printf("1 lock\n");
  12.          while (1) {
  13.           printf("x<=y while\n");

  14.           pthread_cond_wait(&cond, &mut);
  15.           printf("x<=y end\n");
  16.            }
  17.        /* operate on x and y */
  18.         printf("pth1 x<=y\n");
  19.         pthread_mutex_unlock(&mut);
  20. }


  21. void * thr_fun2(void *arg)
  22. {

  23.          pthread_mutex_lock(&mut);

  24.          printf("2 lock\n");

  25.           while (1) {
  26.           pthread_cond_signal(&cond);
  27.           sleep(2);
  28.           printf("x>y while end\n");
  29.            pthread_mutex_unlock(&mut);
  30.           }

  31.          printf("x>y while\n");
  32.           pthread_cond_signal(&cond);
  33.           printf("x>y while end\n");

  34.           // }

  35.       /* operate on x and y */
  36.           x=1;
  37.           y=4;
  38.         printf("pth2 x>y\n");
  39.         pthread_mutex_unlock(&mut);
  40. }

  41. int main()
  42. {
  43.   int err;
  44.  pthread_t tid1;
  45.  pthread_t tid2;


  46.   pthread_create(&tid1,NULL,thr_fun1,0);
  47.   pthread_create(&tid2,NULL,thr_fun2,0);

  48.   while(1)
  49. {
  50.   ;
  51. }
  52. exit(0);
  53. }

阅读(1085) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~