首页 > 代码库 > linux 线程回顾

linux 线程回顾

额,时隔两年重新写博客了。

这次看一下thread_cond_wait(pthread_cond_t * cond, pthread_mutex_t *mutex)和thread_cond_signal(pthread_cond_t *cond);

理解了这两个函数以后,同时对于java中Object的wait()和notify()方法的理解也是会有很多帮助的。

wait中的mutex是用来保护cond,wait的调用者会把wait所在的线程放置在一个线程队列中,这个线程队列等待cond的变化。此过程中的阻塞的并放弃CPU。

wait函数主要做了三件事情:

1、释放之前加过的锁;

2、阻塞并等待cond的变化;

3、返回后在把释放掉的锁再加上;

由此可是调用wait前,一定要有pthead_mutex_lock的相关操作。

而signal将会唤醒线程,值得注意的是signal函数参数只有一个:cond

一般的变成模式如下:

def process:

  pthread_mutex_lock

  while 是否符合条件,不符合进入循环:

    pthread_cond_wait

  process();

  pthread_mutex_unlock

 

def add_meg:

  pthread_mutex_lock

  add()

  pthread_cond_signal

  pthread_mutex_unlock

注意:为什么process中要用while判断条件,wait方法本来就是要阻塞,加上while岂不是多此一举?

答:如果被唤醒以后发现条件不符合,线程并不希望继续向下执行,而是等待条件符合后在执行。

以下代码为简单实例:

 

/*************************************************************************	> File Name: cond.c	> Created Time: Tue 02 Sep 2014 11:31:52 PM CST ************************************************************************/#include"local.h"//很多的.h在这里struct msg{    struct msg * next;} ;struct msg * workq;pthread_cond_t qready = PTHREAD_COND_INITIALIZER;pthread_mutex_t qlock = PTHREAD_MUTEX_INITIALIZER;void* pro_msg(){    struct msg *mp;    printf("pro_msg\n");    while(1){        pthread_mutex_lock(&qlock);        while(workq == NULL){            printf("into while and wait\n");            pthread_cond_wait(&qready, &qlock);
       printf("afte wait\n"); } mp = workq; workq = mp->next; mp->next = NULL; pthread_mutex_unlock(&qlock); }}void* enq(void * mpa){ struct msg * mp = (struct msg *) mpa; pthread_mutex_lock(&qlock); printf("enq\n"); mp->next = workq; workq = mp; pthread_mutex_unlock(&qlock); pthread_cond_signal(&qready);}void main(){ int err; struct msg ww, wq; pthread_t tid1, tid2; workq = NULL; err=pthread_create(&tid1, NULL, enq, (void*)&ww); if(err != 0) printf("error"); err=pthread_create(&tid1, NULL, enq, (void*)&wq); if(err != 0) printf("error"); err=pthread_create(&tid1, NULL, pro_msg, NULL); if(err != 0) printf("error"); pthread_join(tid1, NULL); pthread_join(tid2, NULL);}

 

 

linux 线程回顾