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