首页 > 编程语言 > 详细

c++ 条件变量

时间:2015-12-08 14:29:29      阅读:290      评论:0      收藏:0      [点我收藏+]
1.条件变量创建
静态创建:pthread_cond_t cond=PTHREAD_COND_INITIALIZER;
动态创建:pthread_cond _t cond;
  pthread_cond_init(&cond,NULL);
其中的第二个参数NULL表示条件变量的属性,虽然POSIX中定义了条件变量的属性,但在LinuxThread中并没有实现,因此常常忽略。
2.条件等待
pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_lock(&mutex);
while(条件1)
  pthread_cond_wait(&cond,&mutex);
函数操作1;
pthread_mutex_unlock(&mutex);
当条件1成立的时候,执行pthread_cond_wait(&cond,&mutex)这一句,开放互斥锁,然后线程被挂起。当条件1不成立的时候,跳过while循环体,执行函数操作1,然后开放互斥锁。
3.条件激发
pthread_mutex_lock(&mutex);
函数操作2;
if(条件1不成立)
pthread_cond_signal(&cond);
pthread_mutex_unlock(&mutex);
先执行函数操作2,改变条件状态,使得条件1不成立的时候,执行pthread_cond_signal(&cond)这句话。这句话的意思是激发条件变量cond,使得被挂起的线程被唤醒。
pthread_cond_broadcast(&cond);
这句话也是激发条件变量cond,但是,这句话是激发所有由于cond条件被挂起的线程。而signal的函数则是激发一个由于条件变量cond被挂起的线程。
4.条件变量的销毁
pthread_cond_destroy(&cond);
在linux中,由于条件变量不占用任何资源,所以,这句话除了检查有没有等待条件变量cond的线程外,不做任何操作。
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
int count = 5;

//pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
//pthread_mutex_lock(&mutex);
//while(条件1)
//  pthread_cond_wait(&cond, &mutex);
//函数操作1
//pthread_mutex_unlock(&mutex);
//解释:当条件1成立的时候,执行pthread_cond_wait(&cond, &mutex)这一句,开放互斥锁,然后线程被挂起。
//      当条件1不成立的时候,跳过while循环体,执行函数操作1,然后开放互斥锁
//      即无论走哪个分支,都会放开互斥锁

//此线程先启动
void* decrement(void* arg) {
    while(1) {
        //条件等待
        pthread_mutex_lock(&mutex);
        while(count <= 0) {
            printf("count<=0,thread is hanging!\n");
            pthread_cond_wait(&cond, &mutex); 
            sleep(1);
            printf("sleep!\n");
        }
        count -= 1;
        pthread_mutex_unlock(&mutex);

        if (count == 9) {
            printf("count==9,thread1 is over!\n");
            return NULL;
        }
    }
}

//条件激发
//pthread_mutex_lock(&mutex);
//函数操作2;
//if(条件1不成立)
//  pthread_cond_signal(&cond);
//  pthread_mutex_unlock(&mutex);
//解释:先执行函数操作2,改变条件变量,使得条件1不成立的时候,执行pthread_cond_signal(&cond)这句话的意思是激发条件变量cond,使得被挂起的线程被唤醒。
//      pthread_cond_broadcast(&cond); 激发所有由于cond条件而被挂起的线程。而signal的函数则是激发一个由于条件变量cond被挂起的线程

void *increment(void *arg) {
    sleep(1);
    while(1) {
        pthread_mutex_lock(&mutex);
        count += 1;
        if(count > 0) {
            printf("count=%d, change cond state!\n", count);
            pthread_cond_signal(&cond);
        }
        pthread_mutex_unlock(&mutex);
        
        if (count == 10) {
            printf("count=10,thread is over!\n");
            return NULL;
        }
    }
}

int main(void) {
    int i1=1, i2=1;
    pthread_t id1, id2;
    pthread_mutex_init(&mutex, NULL);
    pthread_cond_init(&cond, NULL);

    pthread_create(&id1, NULL, decrement, NULL);
    pthread_create(&id2, NULL, increment, NULL);

    i2 = pthread_join(id2, NULL);
    i1 = pthread_join(id1, NULL);
    if ( (i2==0) && (i1==0) ) {
        printf("count=%d, the main thread!\n", count);
        pthread_cond_destroy(&cond);
        pthread_mutex_destroy(&mutex);
        return 0;
    }
    return -1;
}

 

c++ 条件变量

原文:http://www.cnblogs.com/i80386/p/5028875.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!