#include <iostream>
#include <threads.h>
#include <unistd.h>
#include <semaphore.h>
using namespace std;
struct Node
{
int num;
Node *next;
};
pthread_mutex_t mutex;
sem_t sem_add;
sem_t sem_delete;
Node *head = (Node*) malloc(sizeof(Node));
int num_size;
void *add(void *arg)
{
while(1)
{
sem_wait(&sem_add);
pthread_mutex_lock(&mutex);
cout<<"this is son thread of add"<<endl;
Node *node = (Node*) malloc(sizeof(Node));
node->num = random()%100;
node->next = head->next;
cout<<"add num :"<<node->num<<endl;
head->next = node;
num_size++;
cout<<"num size = "<<num_size<<endl<<endl;
pthread_mutex_unlock(&mutex);
sem_post(&sem_delete);
sleep(1);
}
}
void *deleted(void *arg)
{
while(1)
{
sem_wait(&sem_delete);
pthread_mutex_lock(&mutex);
while(head->next == NULL)
cout<<"this is son thread of delete"<<endl;
cout<<"delete num"<<head->next->num<<endl<<endl;
Node * temp = head->next;
head->next = head->next->next;
delete(temp);
pthread_mutex_unlock(&mutex);
sem_post(&sem_add);
sleep(1);
}
}
int main() {
pthread_t pid_add[3];
pthread_t pid_deleted[5];
head->num = 0;
head->next = NULL;
num_size = 0;
sem_init(&sem_add, 0, 5);
sem_init(&sem_delete, 0, 0);
pthread_mutex_init(&mutex, NULL);
for(int i = 0;i<3;i++)
{
pthread_create(&pid_add[i],NULL,add,NULL);
}
for(int i = 0;i<5;i++)
{
pthread_create(&pid_deleted[i],NULL,deleted,NULL);
}
for(int i = 0;i<3;i++)
{
pthread_join(pid_add[i],NULL);
}
for(int i = 0;i<5;i++)
{
pthread_join(pid_deleted[i],NULL);
}
}