线程安全队列清单问题在IDE控制台中没有输出

时间:2015-01-13 22:21:45

标签: c multithreading thread-safety pthreads posix

对于我目前正在处理的项目,我需要一个可以跨多个线程使用的队列,以此为契机,了解有关pthreads的更多信息,我编写了下面的代码(没有错误检查/函数)与这个问题无关)。代码在终端中按预期运行,但它在我的IDE(clion)中没有提供任何输出,这使我相信代码中的某个地方可能存在问题,因为我之前遇到了阻止输出的问题在终端中按预期工作时在IDE的控制台中。如果它确实有帮助,我之前的问题是在从Queue_push早期返回时没有解锁互斥锁。非常感谢您在确定问题方面的任何帮助,谢谢您的时间。

struct queue
{
    QueueItem *first;
    QueueItem *last;
    pthread_mutex_t queueMutex;
    pthread_cond_t isEmptyCondition;
    bool isEmpty;
};

void Queue_push(Queue *queue, void *element)
{
    QueueItem *item;
    QueueItem_create(&item);
    item->value = element;

    pthread_mutex_lock(&queue->queueMutex);
    if(queue->isEmpty == true)
    {
        queue->last  = item;
        queue->first = item;
        queue->isEmpty = false;
        pthread_mutex_unlock(&queue->queueMutex);
        pthread_cond_broadcast(&queue->isEmptyCondition);
        return;
    }

    queue->last->next = item;
    queue->last = item;
    pthread_mutex_unlock(&queue->queueMutex);
}

void *Queue_pop(Queue *queue)
{
    pthread_mutex_lock(&queue->queueMutex);

    while(queue->isEmpty == true) {
        pthread_cond_wait(&queue->isEmptyCondition, &queue->queueMutex);
    }

    QueueItem *item = queue->first;

    if(item == queue->last)
    {
        queue->isEmpty = true;
        queue->last = NULL;
    }

    queue->first = item->next;
    pthread_mutex_unlock(&queue->queueMutex);
    return item->value;
}

1 个答案:

答案 0 :(得分:0)

我可以看到几个问题:

  1. 您需要isEmpty吗? length==0意味着空吗?这会导致一些问题,因为在Queue_pop方法中你减少长度而不检查那时队列是否为空,这将导致isEmpty和length之间的不一致。

  2. 在下面的代码中,如果item是queue-> last。你将最后设置为NULL。但是以下行queue->first = item->next将设置queue-> first = NULL-> next,这将导致程序崩溃。

    if(item == queue->last)
    {
        queue->isEmpty = true;
        queue->last = NULL;
    }
    
    queue->first = item->next;
    
    1. 您没有释放任何动态分配的空间。