在 C 中使用信号量的线程安全函数
Thread safe functions using semaphore in C
#include "queue.h"
#include <semaphore.h>
sem_t sem;
Queue queueCreate(unsigned capacity){
sem_init(&sem, 0, 1);
Queue q = malloc(sizeof(queue_t));
q->capacity = capacity;
q->front = q->size = 0;
q->rear = capacity - 1;
q->array = malloc(q->capacity * sizeof(*q->array));
return q;
}
void queueDestroy(Queue q){
free(q->array);
free(q);
sem_destroy(&sem);
}
int queueIsFull(Queue q){
sem_wait(&sem);
return (q->size == q->capacity);
sem_post(&sem);
}
int queueIsEmpty(Queue q){
sem_wait(&sem);
return (q->size == 0);
sem_post(&sem);
}
int queueEnqueue(Queue q, int* value){
sem_wait(&sem);
if (queueIsFull(q)) return -1;
q->rear = (q->rear + 1) % q->capacity;
q->array[q->rear] = *value;
q->size = q->size + 1;
sem_post(&sem);
return 0;
}
int queueDequeueFront(Queue queue, int* container){
sem_wait(&sem);
if (queueIsEmpty(queue)) return -1;
*container = queue->array[queue->front];
queue->front = (queue->front + 1) % queue->capacity;
queue->size = queue->size - 1;
sem_post(&sem);
return 0;
}
int queueDequeueRear(Queue queue, int* container){
sem_wait(&sem);
if (queueIsEmpty(queue)) return -1;
*container = queue->array[queue->rear];
queue->rear = (queue->capacity + queue->rear - 1) % queue->capacity;
queue->size = queue->size - 1;
sem_post(&sem);
return 0;
}
int* queueFront(Queue queue){
sem_wait(&sem);
if (queueIsEmpty(queue)) return NULL;
return &queue->array[queue->front];
sem_post(&sem);
}
int* queueRear(Queue queue){
sem_wait(&sem);
if (queueIsEmpty(queue)) return NULL;
return &queue->array[queue->rear];
sem_post(&sem);
}
void queuePrint(Queue q){
printf("Queue(^: front, *: rear): [");
int i;
for(i = 0; i < q->capacity; i++){
printf("%d", q->array[i]);
if(i == q->front) printf("^");
if(i == q->rear) printf("*");
i == q->capacity - 1 ? printf("] ") : printf(", ");
}
printf("size=%d, capacity=%d\n", q->size, q->capacity);
fflush(stdout);
}
我是初学者,我正在做一项使这些函数“线程安全”所需的作业。它应该是一个库,其他程序将使用它来测试它。可以看到,我全局声明了sem(这感觉我不能在函数里声明),调用sem_init在函数queueCreate中,在函数queueDetroy中调用sem_destroy,基本上把所有sem_wait 和 sem_destroy 的其他函数。但是当我尝试测试它时,测试程序(这些是模板,应该没有错误)基本上卡在一开始,就像在无限循环中一样,需要手动中断。不知道为什么。
您的某些方法正在等待信号量、返回,然后尝试 post 到它。您不能 post 返回函数内的信号量,该函数已完成执行。
例如:
int queueIsFull(Queue q){
sem_wait(&sem);
return (q->size == q->capacity);
sem_post(&sem);
}
应该是:
int queueIsFull(Queue q){
int ret_val;
sem_wait(&sem);
ret_val = (q->size == q->capacity);
sem_post(&sem);
return ret_val
}
#include "queue.h"
#include <semaphore.h>
sem_t sem;
Queue queueCreate(unsigned capacity){
sem_init(&sem, 0, 1);
Queue q = malloc(sizeof(queue_t));
q->capacity = capacity;
q->front = q->size = 0;
q->rear = capacity - 1;
q->array = malloc(q->capacity * sizeof(*q->array));
return q;
}
void queueDestroy(Queue q){
free(q->array);
free(q);
sem_destroy(&sem);
}
int queueIsFull(Queue q){
sem_wait(&sem);
return (q->size == q->capacity);
sem_post(&sem);
}
int queueIsEmpty(Queue q){
sem_wait(&sem);
return (q->size == 0);
sem_post(&sem);
}
int queueEnqueue(Queue q, int* value){
sem_wait(&sem);
if (queueIsFull(q)) return -1;
q->rear = (q->rear + 1) % q->capacity;
q->array[q->rear] = *value;
q->size = q->size + 1;
sem_post(&sem);
return 0;
}
int queueDequeueFront(Queue queue, int* container){
sem_wait(&sem);
if (queueIsEmpty(queue)) return -1;
*container = queue->array[queue->front];
queue->front = (queue->front + 1) % queue->capacity;
queue->size = queue->size - 1;
sem_post(&sem);
return 0;
}
int queueDequeueRear(Queue queue, int* container){
sem_wait(&sem);
if (queueIsEmpty(queue)) return -1;
*container = queue->array[queue->rear];
queue->rear = (queue->capacity + queue->rear - 1) % queue->capacity;
queue->size = queue->size - 1;
sem_post(&sem);
return 0;
}
int* queueFront(Queue queue){
sem_wait(&sem);
if (queueIsEmpty(queue)) return NULL;
return &queue->array[queue->front];
sem_post(&sem);
}
int* queueRear(Queue queue){
sem_wait(&sem);
if (queueIsEmpty(queue)) return NULL;
return &queue->array[queue->rear];
sem_post(&sem);
}
void queuePrint(Queue q){
printf("Queue(^: front, *: rear): [");
int i;
for(i = 0; i < q->capacity; i++){
printf("%d", q->array[i]);
if(i == q->front) printf("^");
if(i == q->rear) printf("*");
i == q->capacity - 1 ? printf("] ") : printf(", ");
}
printf("size=%d, capacity=%d\n", q->size, q->capacity);
fflush(stdout);
}
我是初学者,我正在做一项使这些函数“线程安全”所需的作业。它应该是一个库,其他程序将使用它来测试它。可以看到,我全局声明了sem(这感觉我不能在函数里声明),调用sem_init在函数queueCreate中,在函数queueDetroy中调用sem_destroy,基本上把所有sem_wait 和 sem_destroy 的其他函数。但是当我尝试测试它时,测试程序(这些是模板,应该没有错误)基本上卡在一开始,就像在无限循环中一样,需要手动中断。不知道为什么。
您的某些方法正在等待信号量、返回,然后尝试 post 到它。您不能 post 返回函数内的信号量,该函数已完成执行。
例如:
int queueIsFull(Queue q){
sem_wait(&sem);
return (q->size == q->capacity);
sem_post(&sem);
}
应该是:
int queueIsFull(Queue q){
int ret_val;
sem_wait(&sem);
ret_val = (q->size == q->capacity);
sem_post(&sem);
return ret_val
}