linux条件变量

条件变量用于线程之间的通信,和互斥锁一起使用。条件变量用于及时通知等待的线程条件的变化,使线程不至于错过变化。

考虑下面的情况,有AB两个线程对index这个全局变量进行++,一个线程C用于判断,index是不是3的倍数,如果是就输出除以3的结果。

根据时间片轮转的算法,线程应该是这样执行的。

Index初值为1.

A B C (此时index=3,输出)A B C(此时index=5,不输出) A(此时index=6,c还在队列的最后,错过)BC 。。。。

我们能看出,C会每隔一段时间就错个一个。

如图:

因为三个线程的优先级一样,不存在抢占,而且CPU是把时间片分给每个线程的,所以C的错过是必然的。

所以引入了条件变量。

C线程调用pthread_cond_wait(cond,lock)函数来感知变化。

代码:

#include <pthread.h>  
#include <semaphore.h>
#include <unistd.h>  
#include <stdio.h>
#include<fcntl.h>
#include <pthread.h>
#include <errno.h>

int index = 1;

pthread_mutex_t lock;
pthread_cond_t cond;

void fun1(void){

    while(index<50){
        
    pthread_mutex_lock(&lock);    
    index++;
    printf("In fun1 : %d
",index);
    pthread_cond_signal(&cond);//当有变化后,使用signal通知wait函数
    pthread_mutex_unlock(&lock);
    usleep(0.1);

    }

}

void fun3(void){

    while(index<50){
        
    pthread_mutex_lock(&lock);    
    index++;
    printf("In fun1 : %d
",index);
    pthread_cond_signal(&cond);
    pthread_mutex_unlock(&lock);
    usleep(0.1);

    }

}

void fun2(void){

    int i=0;

    while(i<70){

    pthread_mutex_lock(&lock);

    while(index%3!=0){
    
        pthread_cond_wait(&cond,&lock);//如果获得了互斥锁,但是条件不合适的话,wait会释放锁,不往下执行。当变化后,条件合适,将直接获得锁。

    }
    

    //if(index%3==0)    
    printf("%d
",index/3);
    //else
    //printf("no
");
    i++;

    pthread_mutex_unlock(&lock);

    usleep(0.1);


    }

}

int main(){

    pthread_mutex_init(&lock,NULL);
    pthread_cond_init(&cond,NULL);

    pthread_t tid1,tid2,tid3;
    pthread_create(&tid1,NULL,(void*)fun1,NULL);
    pthread_create(&tid2,NULL,(void*)fun2,NULL);
    pthread_create(&tid3,NULL,(void*)fun3,NULL);

    pthread_join(tid1,NULL);
    pthread_join(tid2,NULL);
    pthread_join(tid3,NULL);




}
原文地址:https://www.cnblogs.com/wzben/p/5431071.html