我正在维护一个多线程并用 C++ 编写的 linux 服务器应用程序。那里大约有 10 个模块和数十个 std::deques 用于消息传递。该应用程序使用生产者-消费者模式在模块之间传递网络数据包。
Producer-Consumer 设计模式在很多情况下都表现良好,但我认为它不适合我们的应用程序。请参阅下面的伪代码中的流聊天:
CSocketModule (for receiving and sending packets)
CSockMod::ReceivePackWorkerThread --> CSockMod::Inque -->
CSockMod::InqueWorkerThread --> CSomeMod::Inque -->
CSomeMod::InqueWorkerThread --> Generates Response Packets -->
CSomeMod::Outque --> CSomeMod::OutqueWorkThread --> //Optional
CSockMod::Outque --> CSockMod::SendPackWorkerThread -->
Linux Kernel::TCP/UDP Layer
For each module, there would be two std::deques for buffering
in/out pakets, two working threads for processing incoming and
outgoing packets respectively.
因为几乎每个 Inque 和 Outque 在运行时都会被两个以上的线程访问,因此必须有很多很多 pthread_mutex_lock 来同步这些队列。但是,这些锁会使应用程序表现得像一个单线程软件。作为服务器应用程序,这不太可能是可接受的。
同时,假设 CSomeMod::Inque 中有 1000 个数据包,第 1000 个数据包是来自客户端的控制数据包,则客户端必须等待 CSomeMod::InqueWorkerThread 处理完 Inque 中的 999 个数据包。控制命令可能会大大延迟!
那么,Producer-Consumer 模式不适合我们的应用吗?还是在这里使用这种模式存在误解?我很感激任何帮助,谢谢!
史蒂夫