第2个回答 2020-12-16
include <fcntl.h>
#include <semaphore.h>
#include <pthread.h>
#include <sys/stat.h>
#define LENTH 8
typedef int T;
typedef struct cycle
{
T data[LENTH];
int head;
int tail;
sem_t *mutex;
sem_t *db;
int reader;
} circular;
int init_queue(circular *queue);
int is_empty(circular queue);
int is_full(circular queue);
int insert(circular queue, const T data);
int popout(circular queue, T *data);
int queue_lenth(circular queue);
int read_queue(int tag, T *data, circular queue);
int close_queue(circular *queue);
int init_queue(circular *queue)
{
queue->head = 0;
queue->tail = 0;
queue->mutex = sem_open("read", O_RDWR | O_CREAT, 0644, 0);
queue->db = sem_open("write", O_RDWR | O_CREAT, 0644, 0);
sem_init(queue->mutex, 0, 1);
sem_init(queue->db, 0, 1);
queue->reader = 0;
return 0;
}
int is_empty(circular queue)
{
int ret;
sem_wait(queue.mutex);
queue.reader++;
if(queue.reader == 1)
sem_wait(queue.db);
sem_post(queue.mutex);
//临界区
ret = (queue.head == queue.tail);
//临界区
sem_wait(queue.mutex);
queue.reader--;
if(queue.reader == 0)