【问题标题】:Semaphores in c linux with Client/server带有客户端/服务器的c linux中的信号量
【发布时间】:2016-06-04 07:17:23
【问题描述】:

我需要一些帮助。

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

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

有人知道怎么做吗?

tnx.

【问题讨论】:

  • “信号量”不是问题。信号量是一种解决方案。请说明您实际想要达到的目标。见stackoverflow.com/help/how-to-ask
  • 我想客户端写入共享内存,之后只有服务器可以工作(读取共享内存)。然后(在服务器红色数据之后)一些客户端可以写入共享内存。等等……
  • 您是否希望一次只有一个客户端能够写入缓冲区?
  • 是的,一次一个客户。
  • 好的,有什么问题吗?你有两个信号量。使用一个“访问”单元,并将其传递给信号量。

标签: c linux client-server semaphore


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-29
    • 1970-01-01
    • 2012-03-07
    • 2012-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-19
    相关资源
    最近更新 更多