1. 程式人生 > >條件變量生產者和消費者模型

條件變量生產者和消費者模型

create void 條件變量 con 消費者 ons 方法 tex 靜態

生產者消費者條件變量模型

線程同步典型的案例即為生產者消費者模型,而借助條件變量來實現這一模型,是比較常見的一種方法。假定有兩個線程,一個模擬生產者行為,一個模擬消費者行為。兩個線程同時操作一個共享資源(一般稱之為匯聚),生產向其中添加產品,消費者從中消費掉產品。

#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>

struct msg {
    struct msg *next;
    int num;
};
struct msg *head;
//靜態初始化 一個條件變量 和 一個互斥變量  可以代替init函數
pthread_cond_t has_product 
= PTHREAD_COND_INITIALIZER; 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; while (1) { 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(int argc, char *argv[]) { 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; }

條件變量生產者和消費者模型