gpt4 book ai didi

multithreading - 具有多个生产者的高效消费者线程

转载 作者:行者123 更新时间:2023-12-03 22:43:15 25 4
gpt4 key购买 nike

我试图通过在必要时跳过昂贵的事件操作来使生产者/消费者线程情况更有效,例如:

//cas(variable, compare, set) is atomic compare and swap
//queue is already lock free

running = false


// dd item to queue – producer thread(s)

if(cas(running, false, true))
{
// We effectively obtained a lock on signalling the event
add_to_queue()
signal_event()
}
else
{
// Most of the time if things are busy we should not be signalling the event
add_to_queue()

if(cas(running, false, true))
signal_event()
}

...

// Process queue, single consumer thread

reset_event()

while(1)
{
wait_for_auto_reset_event() // Preferably IOCP

for(int i = 0; i &lt SpinCount; ++i)
process_queue()

cas(running, true, false)

if(queue_not_empty())
if(cas(running, false, true))
signal_event()
}

显然,试图让这些事情正确有点棘手(!)那么上面的伪代码是否正确?一个解决方案比实际需要的更多地发出事件信号是可以的,但不是对每个项目都这样做的解决方案。

最佳答案

这属于被称为“过早优化”的“停止胡闹,回去工作”的子类别。 :-)

如果“昂贵”的事件操作占用了大量时间,则您的设计是错误的,而不是使用生产者/消费者,您应该使用临界区/互斥锁并仅从调用线程中完成工作。

如果您真的很担心,我建议您配置您的应用程序。

更新:

正确答案:

制作人

ProducerAddToQueue(pQueue,pItem){

EnterCriticalSection(pQueue->pCritSec)
if(IsQueueEmpty(pQueue)){
SignalEvent(pQueue->hEvent)
}

AddToQueue(pQueue, pItem)
LeaveCriticalSection(pQueue->pCritSec)
}

消费者
nCheckQuitInterval = 100; // Every 100 ms consumer checks if it should quit.

ConsumerRun(pQueue)
{
while(!ShouldQuit())
{
Item* pCurrentItem = NULL;
EnterCriticalSection(pQueue-pCritSec);
if(IsQueueEmpty(pQueue))
{
ResetEvent(pQueue->hEvent)
}
else
{
pCurrentItem = RemoveFromQueue(pQueue);
}
LeaveCriticalSection(pQueue->pCritSec);

if(pCurrentItem){
ProcessItem(pCurrentItem);
pCurrentItem = NULL;
}
else
{
// Wait for items to be added.
WaitForSingleObject(pQueue->hEvent, nCheckQuitInterval);
}

}
}

笔记:
  • 该事件是手动重置事件。
  • 临界区保护的操作很快。该事件仅在队列转换为空状态/从空状态转换时设置或重置。它必须在关键部分内设置/重置以避免竞争条件。
  • 这意味着临界区只保留很短的时间。所以争用将是罕见的。
  • 除非存在争用,否则临界区不会阻塞。所以上下文切换将是罕见的。

  • 假设:
  • 这是一个真正的问题,而不是家庭作业。
  • 生产者和消费者大部分时间都花在做其他事情上,即为队列准备项目,在将它们从队列中删除后处理它们。
  • 如果他们大部分时间都在进行实际的队列操作,那么您不应该使用队列。我希望这是显而易见的。
  • 关于multithreading - 具有多个生产者的高效消费者线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3572683/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com