信号量实现生产者消费者(代码逻辑有问题,不适合多个消费者,不常用)
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
#include <sys/types.h>
#include <string.h>
#include <semaphore.h>
struct Node{
int val;
Node* next;
};
sem_t sem_producer;
sem_t sem_consumer;
Node* head = NULL;
void* producer(void* argv){
while(1){
Node* p = (Node*)malloc(sizeof(Node));
p->val = rand() % 1000;
sem_wait(&sem_producer);
printf("sheng chan le %d\n", p->val);
p->next = head;
head = p;
sem_post(&sem_consumer);
sleep(1);
}
}
void* consumer(void* argv){
Node* p = NULL;
while(1){
sem_wait(&sem_consumer);
printf("xiao fei le %d\n", head->val);
p = head;
head = head->next;
sem_post(&sem_producer);
free(p);
p = NULL;
}
}
int main()
{
sem_init(&sem_producer, 0, 5);
sem_init(&sem_consumer, 0, 0);
pthread_t thread1;
pthread_create(&thread1, NULL, consumer, NULL);
pthread_t thread2;
pthread_create(&thread2, NULL, producer, NULL);
pthread_join(thread1, NULL);
pthread_join(thread2, NULL);
sem_destroy(&sem_producer);
sem_destroy(&sem_consumer);
return 0;
}