Linux多线程编程

用消费者生产者模型说明Linux多线程编程

//作用:阻塞并等待某处用函数pthread_cond_signal()发送信号
pthread_cond_wait(&cond, &lock);
//1.进入函数(这时的互斥量已经被锁住)
//2.等待条件
//3.解锁互斥量
//4.等待条件
//5.锁住互斥量
//6.函数返回(这时的互斥量还是被锁住)
//
//说明:
//1.在第2步就开始等待,是为了防止条件改变发生在第3步和第4步之间,防止遗漏任何的条件改变
//2.在进入函数时就锁住互斥量,保护了条件变量,防止条件变量在调用函数pthread_cond_wait()之前就改变
//3.函数pthread_cond_wait()放在while()循环中,可防止当该函数返回时,被互斥量保护的普通变量goods仍不满足条件
#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>

#define MAX 20

pthread_mutex_t lock;
pthread_cond_t cond;
int goods = 0;
void *ThrPro(void *ptr)
{
    sleep(5);//休眠5s
    int i;
    for(i = 0; i < MAX; i++) {
        pthread_mutex_lock(&lock);
        while(goods != 0)
            pthread_cond_wait(&cond, &lock);
        printf("pro add, i:%d, goods:%d\n", i, goods);
        goods++;
        pthread_cond_signal(&cond);
        pthread_mutex_unlock(&lock);
    }
    pthread_exit(0);
}

void *ThrCon(void *ptr)
{
    int i;
    for(i = 0; i < MAX; i++) {
        pthread_mutex_lock(&lock);
        while(goods == 0)
            pthread_cond_wait(&cond, &lock);
        printf("con min, i:%d, goods:%d\n", i, goods);
        goods--;
        pthread_cond_signal(&cond);
        pthread_mutex_unlock(&lock);
    }
    pthread_exit(0);
}

int main()
{
    pthread_t pro, con;

    pthread_mutex_init(&lock, 0);//初始化互斥量lock
    pthread_cond_init(&cond, 0);//初始化条件变量
    pthread_create(&pro, 0, ThrPro, 0);//创建线程pro,从函数ThrPro处运行
    pthread_create(&con, 0, ThrCon, 0);//创建线程con,从函数ThrCon处运行
    pthread_join(pro, 0);//阻塞,以等待线程pro结束
    pthread_join(con, 0);//阻塞,以等待线程con结束
    pthread_mutex_destroy(&lock);//释放互斥量lock
    pthread_cond_destroy(&cond);//释放条件变量cond
    return 0;
}
posted @ 2017-04-24 22:12  水煮海鲜  阅读(126)  评论(0编辑  收藏  举报