您的位置:首页 > 运维架构 > Linux

linux 多线程 pthread_cond_wait(&cond,&mutex)理解

2013-11-29 14:11 471 查看
pthread_cond_wait()用于阻塞一个线程,知道有信号唤醒它。下面是一个简单的例子,我们可以从程序的运行来了解条件变量的作用

//pthread_cond_wait.c
#include <pthread.h>

#include <stdio.h>

#include <stdlib.h>

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;/*初始化互斥锁*/

pthread_cond_t cond = PTHREAD_COND_INITIALIZER;/*初始化条件变量*/

void *thread1(void *);

void *thread2(void *);

int i=1;

int main(void)

{
    pthread_t t_a;
    pthread_t t_b;

    pthread_create(&t_a,NULL,thread2,(void *)NULL);/*创建进程t_a*/
    pthread_create(&t_b,NULL,thread1,(void *)NULL); /*创建进程t_b*/
    pthread_join(t_b, NULL);/*等待进程t_b结束*/
    pthread_mutex_destroy(&mutex);
    pthread_cond_destroy(&cond);
    exit(0);

}

void *thread1(void *junk)

{
    for(i=1;i<=9;i++) 
    {

        pthread_mutex_lock(&mutex);/*锁住互斥量*/

        if(i%3==0)

             pthread_cond_signal(&cond);/*条件改变,发送信号,通知t_b进程*/

        else        

             printf("thead1:%d\n",i);

        pthread_mutex_unlock(&mutex);/*解锁互斥量*/

sleep(1);

}
}

void *thread2(void *junk)

{
    while(i<9)
    {

        pthread_mutex_lock(&mutex);

if(i%3!=0)

            pthread_cond_wait(&cond,&mutex);/*等待*/

        printf("thread2:%d\n",i);

        pthread_mutex_unlock(&mutex);

sleep(1);

}
}

程序创建了2个新线程使他们同步运行,实现进程t_b打印20以内3的倍数,t_a打印其他的数,程序开始线程t_b不满足条件等待,线程t_a运行使a循环加1并打印。直到i为3的倍数时,线程t_a发送信号通知进程t_b,这时t_b满足条件,打印i值。

gcc pthread_cond_wait.c
-o pthread_wait -lpthread
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: