#include<stdio.h>
#include<pthread.h>
#include<semaphore.h>
#include<malloc.h>
struct job{
struct job* next;
};
struct job* job_queue;
pthread_mutex_t job_queue_mutex = PTHREAD_MUTEX_INITIALIZER;
sem_t job_queue_count;
void initialize_job_queue()
{
job_queue = NULL;
sem_init (&job_queue_count,0,0);
}
void process_job(struct job *next_job)
{
static int i = 0;
printf("you is a reader%d/n",i++);
}
void* thread_function(void *arg)
{
while(1)
{
struct job* next_job;
sem_wait(&job_queue_count);
pthread_mutex_lock(&job_queue_mutex);
next_job = job_queue;
job_queue=job_queue->next;
pthread_mutex_unlock(&job_queue_mutex);
process_job(next_job);
free(next_job);
}
}
void* enqueue_job(void* arg)
{
struct job* new_job;
new_job = (struct job*)malloc(sizeof(struct job));
pthread_mutex_lock(&job_queue_mutex);
new_job->next = job_queue;
job_queue = new_job;
sem_post(&job_queue_count);
pthread_mutex_unlock(&job_queue_mutex);
}
int main()
{
int i=0;
pthread_t thread;
initialize_job_queue();
while(i < 7)
{
pthread_create(&thread,NULL,&enqueue_job,NULL);
pthread_create(&thread,NULL,&thread_function,NULL);
i++;
}
return 0;
}