我有一个应用程序,生产者和消费者(“客户”)想要相互发送广播消息,即n:m
关系。所有这些都可能是不同的程序,因此它们是不同的进程而不是线程。
为了减少n:m
到更易于维护的东西,我正在考虑一个设置,比如引入一个小的中央服务器。该服务器将提供一个套接字,每个客户端都可以连接到该套接字。
每个客户端都会通过该套接字向服务器发送一条新消息 - 导致1:n
.
服务器还将提供对客户端只读的共享内存。它将被组织为一个环形缓冲区,新消息将由服务器添加并覆盖旧消息。
这会给客户一些时间来处理消息 - 但如果它太慢,那就是运气不好,无论如何它都不再相关了......
我看到这种方法的优点是我避免了同步以及不必要的数据复制和缓冲区层次结构,中央一个应该就足够了,不是吗?
到目前为止,这就是架构 - 我希望它有意义......
现在到了实现它的更有趣的方面:
环形缓冲区中最新元素的索引是共享内存中的一个变量,客户端只需等待它发生变化。而不是愚蠢的while( central_index == my_last_processed_index ) { /* do nothing */ }
我想释放 CPU 资源,例如通过使用pthread_cond_wait()
.
但这需要一个我认为我不需要的互斥锁——另一方面,为什么 pthreads 的条件变量函数需要一个互斥锁?给我的印象是我最好问问我的架构是否有意义并且可以这样实现......
如果所有这些都有意义并且可行,你能给我一个提示吗?
(旁注:客户端程序也可以用 Perl 和 Python 等通用脚本语言编写。因此与服务器的通信必须在那里重新创建,因此不应该太复杂甚至专有)