具有客户机/服务器的c linux中的信号量

具有客户机/服务器的c linux中的信号量,c,linux,client-server,semaphore,C,Linux,Client Server,Semaphore,我需要一些帮助 我想创建两个信号量: 第一个信号灯。客户端在完成写入共享内存时锁定信号量,只有服务器才能从共享内存中读取。 第二个信号灯。在服务器从共享内存中恢复后,服务器将打开信号量进行写入 我想让客户端写入共享内存,之后只有服务器可以工作(读取共享内存)。然后(在服务器刷新数据之后),一些客户机可以写入共享内存。等等 有人知道怎么做吗 tnx.解决这个问题的一种方法是使用两个信号量控制访问。一个信号量设置是否允许客户端写入缓冲区,另一个信号量设置是否允许服务器读取缓冲区 每个客户端都尝试获取

我需要一些帮助

我想创建两个信号量: 第一个信号灯。客户端在完成写入共享内存时锁定信号量,只有服务器才能从共享内存中读取。 第二个信号灯。在服务器从共享内存中恢复后,服务器将打开信号量进行写入


我想让客户端写入共享内存,之后只有服务器可以工作(读取共享内存)。然后(在服务器刷新数据之后),一些客户机可以写入共享内存。等等

有人知道怎么做吗


tnx.

解决这个问题的一种方法是使用两个信号量控制访问。一个信号量设置是否允许客户端写入缓冲区,另一个信号量设置是否允许服务器读取缓冲区

每个客户端都尝试获取缓冲区写入信号量。当它成功时,它写入数据,然后增加读取信号量

服务器在循环中获取读取信号量,处理数据,然后增加写入信号量

但是,此解决方案存在严重的性能问题。您的所有任务都有效地完全序列化。当服务器正在处理作业时,客户端无法发布作业。没有两个客户可以同时准备作业。尽管您采用了多线程设计,但在这里您只能有效地使用一个内核


更好的解决方案是使用两个缓冲区,让服务器处理一个作业,而客户端准备下一个作业。同步在这里变得更加复杂,因为您需要确保每次都选择正确的缓冲区。

“信号量”不是问题。信号量是一种解决方案。请详细说明您实际想要实现的目标。请参阅我希望客户端写入共享内存,然后只有服务器可以工作(读取共享内存)。然后(在服务器刷新数据之后),一些客户机可以写入共享内存。以此类推……您希望一次只能有一个客户机写入缓冲区吗?是的,一次只能有一个客户机。好的,那么问题出在哪里?你有两个信号灯。使用一个“访问”单元,并将其传递给信号灯。