首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C中使用信号量的线程安全函数

C中使用信号量的线程安全函数
EN

Stack Overflow用户
提问于 2020-11-30 04:50:31
回答 1查看 137关注 0票数 0
代码语言:javascript
运行
复制
#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 (这感觉不像我可以在函数中声明),在函数queueCreate中调用sem_init,在function Quee底特律E 210中调用sem_destroy,并且基本上用e 111sem_wait>e 212和封装所有其他函数。但是当我尝试测试它时,测试程序(这些是模板,应该是没有错误的)基本上停留在一开始,就像在一个无限循环中,需要手动中断。我也不知道原因。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-30 05:05:34

您的一些方法正在等待信号量,然后返回,然后尝试发送到它。不能在返回的函数中向信号量发送,该函数已完成其执行。

例如:

代码语言:javascript
运行
复制
int queueIsFull(Queue q){
sem_wait(&sem);
return (q->size == q->capacity);
sem_post(&sem);
}

应:

代码语言:javascript
运行
复制
int queueIsFull(Queue q){
int ret_val;
sem_wait(&sem);
ret_val = (q->size == q->capacity);
sem_post(&sem);
return ret_val
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65068253

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档