c - 线程安全队列的问题表现为 IDE 控制台中没有输出

标签 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. 您需要isEmpty吗? length==0 是否表示空?这会导致一些问题,因为在 Queue_pop 方法中,您减少了长度,而没有检查当时队列是否为空,这将导致 isEmpty 和 length 之间不一致。

  2. 在下面的代码中,如果项目是队列->最后一个。您将把最后设置为NULL。但是下面这行queue->first = item->next会设置queue->first=NULL->next,这会导致你的程序崩溃。

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

关于c - 线程安全队列的问题表现为 IDE 控制台中没有输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27932578/

相关文章:

javascript - WebAssembly 链接错误 : function import requires a callable

arrays - 如何比较 C 中由 strdup() 创建的两个字符串数组?

Java SNMP4J 陷阱应用程序正在卡住 GUI

java - SwingUtilities.invokeLater(runnable) 和 Swing Timer 如何工作?

C 结构中的内存错误

C - 调整/放大图像

node.js - Nodejs 子进程最大 cpu`s 作为限制

使用 get/set 的 C# 线程安全

Java非最终静态Map在静态 block 中的操作

c++ - GSL+OMP : Thread safe random number generators in C++