gpt4 book ai didi

c++ - 多线程单读单写fifo队列

转载 作者:IT王子 更新时间:2023-10-29 00:20:18 25 4
gpt4 key购买 nike

我需要一个队列来将消息从一个线程 (A) 传递到另一个线程 (B),但是我无法找到真正满足我要求的队列,因为它们通常允许添加一个项目失败,这种情况下在我的情况下,这几乎是致命的,因为需要处理消息,并且线程真的不能停止并等待空闲空间。

  • 只有线程 A 添加项目,只有线程 B 读取它们
  • 线程 A 绝不能阻塞,但是线程 B 对性能不是关键的,所以它可以
  • 添加项目必须始终成功,因此队列不能有大小上限(系统内存不足)
  • 如果队列为空,线程B应该等待,直到有一个项目要处理

最佳答案

下面是用 C++ 编写无锁队列的方法:

http://www.ddj.com/hpc-high-performance-computing/210604448

但是当你说“线程 A 不能阻塞”时,你确定这是要求吗? Windows 不是实时操作系统(正常使用的 Linux 也不是)。如果您希望线程 A 能够使用所有可用的系统内存,那么它需要分配内存(或等待其他人分配内存)。操作系统本身无法提供比读者和编写者都使用进程内锁(即非共享互斥锁)以操作列表时更好的时间保证。添加消息的最坏情况是必须转到操作系统以获取内存。

简而言之,您不喜欢那些具有固定容量的队列是有原因的 - 这样它们就不必在所谓的低延迟线程中分配内存。

因此,无锁代码通常不会那么阻塞,但由于内存分配的原因,它不能保证如此,除非你有一个真正巨大的流,否则使用互斥体的性能不应该那么糟糕要处理的事件(例如,您正在编写网络驱动程序并且消息是传入的以太网数据包)。

所以,在伪代码中,我首先要尝试的是:

Writer:
allocate message and fill it in
acquire lock
append node to intrusive list
signal condition variable
release lock

Reader:
for(;;)
acquire lock
for(;;)
if there's a node
remove it
break
else
wait on condition variable
endif
endfor
release lock
process message
free message
endfor

只有当这被证明会在编写器线程中引入 Not Acceptable 延迟时,我才会使用无锁代码(除非我碰巧已经有一个合适的队列)。

关于c++ - 多线程单读单写fifo队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1448276/

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