首先介绍一下条件变量
下面用条件变量来实现生产者-消费者模型
大体思路如下:生产者为链表“生产”结点,消费者“消费”结点,如果链表中没有结点,则阻塞消费者线程
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
#include <pthread.h>
#include <ctime>
pthread_mutex_t mutex;
pthread_cond_t cond;
struct Node{
int val;
Node* next;
Node(int _val): val(_val), next(NULL){}
};
Node* head;
void Print(Node* h) {
while (h) {
printf("%d->", h->val);
h = h->next;
}
printf("\n");
}
void* producer(void* argc) {
srand(time(NULL));
while (1) {
int val = rand() % 10;
Node* cur = new Node(val);
// 生产者开始生产结点
pthread_mutex_lock(&mutex);
cur->next = head;
head = cur;
Print(head);
pthread_mutex_unlock(&mutex);
// 生产者生产完后唤醒消费者
pthread_cond_signal(&cond);
sleep(1);
}
return NULL;
}
void* customer(void* argc) {
while (1) {
pthread_mutex_lock(&mutex);
if (head == NULL) { // 如果链表中还没有结点,则阻塞线程
printf("wait\n");
pthread_cond_wait(&cond, &mutex);
}
// 消费者开始消费结点
Node* tmp = head;
printf("tmp == %d\n", tmp->val);
head = head->next;
pthread_mutex_unlock(&mutex);
delete tmp;
sleep(2);
}
return NULL;
}
int main() {
pthread_t p1, p2; // 创建两个线程,p1作为生产者,p2作为消费者
pthread_create(&p1, NULL, producer, NULL);
pthread_create(&p2, NULL, customer, NULL);
pthread_mutex_init(&mutex, NULL); // 初始化互斥锁
pthread_cond_init(&cond, NULL); // 初始化条件变量
pthread_join(p1, NULL); // 销毁两个线程
pthread_join(p2, NULL);
pthread_mutex_destroy(&mutex); // 销毁互斥锁
pthread_cond_destroy(&cond); // 销毁条件变量
return 0;
}
结果如下: