#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>
#include <semaphore.h>
struct Node{
int num;
struct Node *next;
};
pthread_mutex_t mutex;
sem_t psem;
sem_t csem;
struct Node * head = NULL;
void* producer(void* arg){
while(1){
sem_wait(&psem);
pthread_mutex_lock(&mutex);
struct Node * newNode = (struct Node *)malloc(sizeof(struct Node));
newNode->next = head;
head = newNode;
newNode->num = rand()%1000;
printf("produce tids:%ld num:%d\n",pthread_self(),newNode->num);
pthread_mutex_unlock(&mutex);
sem_post(&csem);
usleep(100);
}
return NULL;
}
void* customer(void* arg){
while(1){
sem_wait(&csem);
pthread_mutex_lock(&mutex);
struct Node * tmp = head;
head = head->next;
printf("customer tids:%ld num:%d\n",pthread_self(),tmp->num);
free(tmp);
pthread_mutex_unlock(&mutex);
sem_post(&psem);
usleep(100);
}
return NULL;
}
int main(){
pthread_mutex_init(&mutex,NULL);
sem_init(&psem,0,8);
sem_init(&csem,0,0);
pthread_t pids[5],cids[5];
for(int i=0;i<5;i++){
pthread_create(&pids[i],NULL,producer,NULL);
pthread_create(&cids[i],NULL,customer,NULL);
}
for(int i=0;i<5;i++){
pthread_detach(pids[i]);
pthread_detach(cids[i]);
}
while(1) {
sleep(10);
}
sem_destroy(&psem);
sem_destroy(&csem);
pthread_mutex_destroy(&mutex);
pthread_exit(NULL);
return 0;
}