欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

用Linux多线程编程(C语言版):构建基于互斥锁的线程安全队列实例

最编程 2024-07-25 07:04:13
...
  • /*
  •  * \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;
  • }