线程同步条件变量

条件变量是利用线程间共享的全局变量进行同步的一种机制,条件变量主要包括两个动作

1:等待使用资源的线程等待条件变量为真时启动;
2:另一个线程在使用完资源后将条件设置为真,
而条件变量的保护一般用互斥锁来保护.

如下例子:
/***************************************************************

File Name: condition3.c
Author:motian
Mail:765885195@qq.com
Created Time: 2016年08月01日 星期一 16时26分36秒
**************************************************************/

#include<stdio.h>
#include<pthread.h>
#include<stdlib.h>

void *thread1(void *);
void *thread2(void *);

pthread_cond_t cond;
pthread_mutex_t mutex;

int i;      

int main(void)
{
    pthread_t t1,t2;

    pthread_cond_init(&cond,NULL);   //初始化条件变量
    pthread_mutex_init(&mutex,NULL); //初始化互斥锁

    pthread_create(&t1,NULL,thread1,NULL); //创建线程
    pthread_create(&t2,NULL,thread2,NULL); 

    pthread_join(t1,NULL); //等待线程结束
    pthread_join(t2,NULL); 

    pthread_cond_destroy(&cond);    //清除条件变量和互斥锁
    pthread_mutex_destroy(&mutex);

    exit(0);
}

void *thread1(void *arg)
{
    for(i=1;i<6;i++)
    {
        pthread_mutex_lock(&mutex);    //给互斥锁加锁

        printf("xiyoulinux\n");

        if(i==3)
        {
            pthread_cond_signal(&cond);    //发射信号唤醒thread2
        }   

        pthread_mutex_unlock(&mutex);  //解锁 
        sleep(1);
    } 
}   

void *t hread2(void *arg)
{   

    pthread_mutex_lock(&mutex);

    pthread_cond_wait(&cond,&mutex);  //先等待thread1解锁,然后等待被信号唤醒

    printf("motian\n");

    pthread_mutex_unlock(&mutex);
}

输出结果:
xiyoulinux
xiyoulinux
xiyoulinux
motian
xiyoulinux
xiyoulinux

程序开始创建了两个线程:
线程1循环打印;
线程二一开始就被阻塞,等待被唤醒.

当i=3时,即条件变量为真时,满足if条件,到线程1的pthread_cond_signal(&cond),发射信号给线程2的pthread_cond_wait (&cond,&mutex);线程2被激活.

线程2被激活时,并没有立即得到运行 ,因为线程2还在等待mutex锁的释放,所以线程1继续往下走,直到线程1释放mutex锁,线程2才能停止等待,打印语句.结束.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值