线程相关函数(6)-pthread_cond_wait(),pthread_cond_signal(), 条件变量

pthread_cond_t
pthread_cond_init
pthread_cond_destroy
pthread_cond_wait
pthread_cond_timedwait
pthread_cond_signal
pthread_cond_broadcast

生产者消费者模型:

#include <pthread.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <time.h>

struct msg {
    struct msg *next;
    int num;
};


struct msg *head;
pthread_cond_t has_product = PTHREAD_COND_INITIALIZER;
static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;


void *consumer(void *p)
{
    struct msg *mp;
    for(;;) {
        pthread_mutex_lock(&lock);
        while (head == NULL)
            pthread_cond_wait(&has_product, &lock);
        mp = head;
        head = mp->next;
        pthread_mutex_unlock(&lock);
        printf("Consume %d\n", mp->num);
        free(mp);
        sleep(rand() % 5);    
    }
}

void *producer(void *p)
{
    struct msg *mp;
    for(;;) {
        mp = malloc(sizeof(struct msg));
        mp->num = rand() % 1000 + 1;
        printf("Produce %d\n", mp->num);
        pthread_mutex_lock(&lock);
        mp->next = head;
        head = mp;
        pthread_mutex_unlock(&lock);
        pthread_cond_signal(&has_product);
        sleep(rand() % 5);
    }
}

int main()
{
    pthread_t pid, cid;

    srand(time(NULL));
    pthread_create(&pid, NULL, producer, NULL);
    pthread_create(&cid, NULL, consumer, NULL);
    pthread_join(pid, NULL);
    pthread_join(cid, NULL);
    return 0;
}

运行结果:

Produce 1
Consume 1
Produce 22
Produce 756
Consume 756
Produce 909
Produce 941
Consume 941
Consume 909
Consume 22
Produce 307
Produce 667
Produce 567
Produce 609
Consume 609
Produce 892
Consume 892
Produce 883

...

 

posted @ 2018-01-11 15:06  夜行过客  阅读(489)  评论(0编辑  收藏  举报