分享

多线程编程之条件变量(YC)

 champion_xu 2012-04-27
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<pthread.h>
#include<time.h>

#define apple_not_enough 3
int not_anymore = 0;

struct apple_struct
{
    int num;
    pthread_mutex_t lock;
//    pthread_cond_t fantastic;
    pthread_cond_t enough;
};

struct apple_struct apple;


void *consume(void *arg)
{
    int i;
    i = 10;
    sleep(1);
    pthread_mutex_lock(&apple.lock);
    while(i!=0) {
        while(apple.num==0) {
            printf("apple not enough, want more\n");
            pthread_cond_wait(&apple.enough,&apple.lock);  //等待时候阻塞此进程,所以永远不会出现苹果个数小于0,发送信号给等待的第一个线程,这里只有两个
        }

        apple.num--;
        printf("consume 1 apple,now left %d\n",apple.num);
        if(apple.num<0) break;
        i--;
//        pthread_cond_signal(&apple.fantastic);
        pthread_mutex_unlock(&apple.lock);
        sleep(1);  //消耗苹果速率快于生产
        pthread_mutex_lock(&apple.lock);
    }

    
    if(i!=0) printf("Fuck!\n");
    else printf("I'm full\n");
    not_anymore = 1;    
    pthread_mutex_unlock(&apple.lock);
    return NULL;
}

void *produce(void *arg)
{
    pthread_mutex_lock(&apple.lock);
    while(!not_anymore) {    
        apple.num++;
        printf("produce 1 apple more,now have %d\n",apple.num);
        pthread_cond_signal(&apple.enough);
        pthread_mutex_unlock(&apple.lock);
        sleep(3);  //生产苹果速率慢于消耗
        pthread_mutex_lock(&apple.lock);
    }
    printf("OK! My job is done! dala dala...\n");
    pthread_mutex_unlock(&apple.lock);
    return NULL;
}

int main(void)
{
    pthread_t con,pro;
    int ret;
    void *val;

    apple.num = 3;
    pthread_mutex_init(&apple.lock,NULL);
    pthread_cond_init(&apple.enough,NULL);
    
    ret = pthread_create(&con,NULL,consume,NULL);
    if(ret!=0) {
        printf("create consume fail\n");
        return -1;
    }

    ret = pthread_create(&pro,NULL,produce,NULL);
    if(ret!=0) {
        printf("create produce fail\n");
        return -1;
    }

    ret = pthread_join(con,&val);
    if(ret!=0) {
        printf("can not wait to consume finish\n");
        return -1;
    }
    ret = pthread_join(pro,&val);
    if(ret!=0) {
        printf("can not wait to produce finish\n");
        return -1;
    }
    return 0;
}
                
运行结果:

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多