用Linux多线程编程(C语言版):构建基于互斥锁的线程安全队列实例
...
/*
* \File
* cir_queue.c
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <pthread.h>
#include <semaphore.h>
#include "cir_queue.h"
pthread_mutex_t queue_mutex;
/*
* \Func
*
*/
void init_cir_queue(cir_queue_t *q)
{
int res;
res= pthread_mutex_init(&queue_mutex, NULL);
if (res != 0)
{
perror("Mutex init failed.\n");
exit(EXIT_FAILURE);
}
memset(q->data, 0, QUE_SIZE*sizeof(DataType));
q->front = q->rear = 0;
q->count = 0;
}
/*
* \Func
*
*/
int is_empty_cir_queue(cir_queue_t *q)
{
int empty_flag;
pthread_mutex_lock(&queue_mutex);
empty_flag = q->front == q->rear;
pthread_mutex_unlock(&queue_mutex);
return empty_flag;
}
/*
* \Func
*
*/
int is_full_cir_queue(cir_queue_t *q)
{
int full_flag;
pthread_mutex_lock(&queue_mutex);
full_flag = q->rear == QUE_SIZE - 1 + q->front;
pthread_mutex_unlock(&queue_mutex);
return full_flag;
}
/*
* \Func
*
*/
void push_cir_queue(cir_queue_t *q, DataType x)
{
if (is_full_cir_queue(q))
{
printf("queue overflow.\n");
return ;
}
pthread_mutex_lock(&queue_mutex);
q->count++;
q->data[q->rear] = x;
q->rear = (q->rear+1) % QUE_SIZE;
pthread_mutex_unlock(&queue_mutex);
}
/*
* \Func
*
*/
DataType pop_cir_queue(cir_queue_t *q)
{
DataType temp;
if (is_empty_cir_queue(q))
{
printf("queue empty.\n");
return 0;
}
pthread_mutex_lock(&queue_mutex);
temp = q->data[q->front];
q->data[q->front] = 0;
q->count--;
q->front = (q->front+1) % QUE_SIZE;
pthread_mutex_unlock(&queue_mutex);
return temp;
}
/*
* \Func
*
*/
DataType top_cir_queue(cir_queue_t *q)
{
DataType x;
if (is_empty_cir_queue(q))
{
printf("queue is empty.\n");
return 0;
}
pthread_mutex_lock(&queue_mutex);
x = q->data[q->front];
pthread_mutex_unlock(&queue_mutex);
return x;
}
void destroy_cir_queue(cir_queue_t *q)
{
pthread_mutex_destroy(&queue_mutex);
return;
}
void print_queue(cir_queue_t* q)
{
int index;
if (is_empty_cir_queue(q))
{
printf("queue is empty.\n");
return;
}
pthread_mutex_lock(&queue_mutex);
printf("QUEUE: ");
for (index = 0; index < QUE_SIZE; index++)
{
printf(" %d ", q->data[index]);
}
printf("\n");
pthread_mutex_unlock(&queue_mutex);
return;
}