linux中高性能消息在c ++中的线程之间传递

Chu*_*ris 1 c++ linux performance messaging

说我有一个产生2个线程的进程

第一个线程在UDP端口上监听数据包事件的紧密循环.第二个线程是接收此UDP数据包中包含的字节并解析它/做东西.

谁能推荐比使用linux消息队列更快的方法?我认为它们很慢,因为它们在写入队列时复制字节并在从队列中读取时再次复制它们

我知道zeromq库,但有没有一个光滑的方式来做到这一点没有这个开销?我意识到我可以在两个线程之间使用tcp/ip套接字进行简单的排队通信但是有更快的方法吗?

我想也许内存中的环形缓冲区是在线程和用于控制指向最近更新元素的指针的互斥体之间共享的?

任何想法在这里?

Jer*_*ner 5

我能想到的最有效的方法是使用一个链表,一个互斥锁和一个条件变量:

__PRE__

这为您提供了零拷贝通信机制.持有互斥锁所花费的时间很少,因此争用率也应该很低.

如果你想进一步优化,你可以让线程B一次从链表中抓取所有项目,而不是一次只弹出一个 - 这可以在O(1)时间内完成带有链表.然后,只有当链接列表在附加其最新的udp-packet-buffer对象之前为空时,才让线程A发出条件变量信号.这将减少线程在重负载下锁定/解锁/发出信号的次数.