条件变量condition

一句话总结:pthread_cond_signal仅给一个线程发信号让其脱离阻塞状态继续运行,pthread_cond_wait的流程是lock(调用前先将信号量加锁)-->unlock-->wait()return-->lock。

1、使用pthread_cond_signal最多只给一个线程发信号。假如有多个线程正在阻塞等待着这个条件变量的话,那么是根据各等待线程优先级的高低确定哪个线程接收到信号开始继续执行。如果各线程优先级相同,则根据等待时间的长短来确定哪个线程获得信号。但无论如何pthread_cond_signal调用一次最多发信号一次。如果没有其他进程阻塞那么也成功返回。

而pthread_cond_broadcast()则激活所有等待线程。


2、pthread_cond_wait:条件变量是利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:一个线程等待"条件变量的条件成立"而挂起;另一个线程使"条件成立"(给出条件成立信号)。为了防止竞争,条件变量的使用总是和一个互斥锁结合在一起。


#include <iostream>

#include <pthread.h>

#include <stdlib.h>

using namespacestd;


pthread_mutex_t g_mutex =PTHREAD_MUTEX_INITIALIZER;//初始化互斥锁

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

uint g_cnt = 0;


void *thread1(void* arg)

{

    while (g_cnt <=4) {

        pthread_mutex_lock(&g_mutex);  //锁住互斥量

        cout<<"thread1:lock "<<__LINE__<<endl;

        if (0 ==g_cnt%2) {

            cout<<"thread1:send signal start... "<<endl;

            pthread_cond_signal(&g_cond);//发送一个信号给另外一个正在处于阻塞等待状态的线程,使其脱离阻塞状态,继续执行

            cout<<"thread1:send signal end... "<<endl;

            sleep(1);

        }

        pthread_mutex_unlock(&g_mutex);

        cout<<"thread1:unlock "<<endl;

        sleep(1);

        ++g_cnt;

    }

    returnNULL;

}


void *thread2(void* arg)

{

    while (g_cnt <=4) {

        pthread_mutex_lock(&g_mutex);  //锁住互斥量

        cout<<"thread2:lock "<<__LINE__<<endl;

        if (1 ==g_cnt%2) {

            cout<<"thread2:wait signal start... "<<endl;

            pthread_cond_wait(&g_cond, &g_mutex);   //流程是:lock-->unlock-->wait()return-->lock

            cout<<"thread2:wait signal end... "<<endl;

        }

        pthread_mutex_unlock(&g_mutex);

        cout<<"thread2:unlock "<<endl;

        sleep(1);

    }

    returnNULL;

}


int main(int argc,constchar * argv[]) {

    // insert code here...

    pthread_t t1;

    pthread_t t2;

    pthread_create(&t1,NULL,thread1,NULL);

    pthread_create(&t2,NULL,thread2,NULL);

    pthread_join(t1,NULL);

    pthread_join(t2,NULL);

    pthread_mutex_destroy(&g_mutex);

    pthread_cond_destroy(&g_cond);

    exit(0);

    

    return0;

}


部分结果流程:

thread2:lock 41

thread2:wait signal start... 

thread1:lock 22

thread1:send signal start... 

thread1:send signal end... 

thread1:unlock 

thread2:wait signal end... 

thread2:unlock 




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值