【问题标题】:Issue with thread safe queue manifests as no output in IDE's console线程安全队列的问题表现为 IDE 控制台中没有输出
【发布时间】:2015-03-12 00:35:56
【问题描述】:

对于我目前正在进行的项目,我需要一个可以跨多个线程使用的队列,借此机会了解更多关于 pthread 的信息我编写了下面提供的代码(没有错误检查/与这个问题)。代码在终端中按预期运行,但是它在我的 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;
}

【问题讨论】:

    标签: c multithreading thread-safety pthreads posix


    【解决方案1】:

    我可以看到几个问题:

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

    2. 在下面的代码中,如果 item 是 queue->last。您将 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. 您没有释放任何动态分配的空间。

    【讨论】:

    • 1. length 是调试的产物,稍后将删除它,因为我不需要知道队列的长度,此外,我读到在使用 pthread_cond_wait 时应该使用布尔测试,这就是 isEmpty 存在的原因。这不正确吗? 2 + 3。这些不是问题,正如我的问题所述,我没有发布所有代码,只有与我遇到的问题相关的代码。错误检查、空值检查和释放只会延长代码。据我所知,如果我错了,请纠正我。
    • 好的。我得到了它。所以你根本没有使用长度。
    • 正确,它只是用于调试目的
    猜你喜欢
    • 2010-10-07
    • 2017-06-14
    • 2012-11-05
    • 1970-01-01
    • 1970-01-01
    • 2017-06-01
    • 2011-04-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多