如何在套接字

时间:2017-06-17 17:49:53

标签: c sockets locking client-server mutual-exclusion

我在问一些理论问题,因为我很难发布涉及的项目代码,这些代码由太多文件组成。

我正在为服务器程序编写代码,该程序必须与发送各种不同请求的几个客户端进行通信,并期望为每个客户端提供答案。 服务器是多线程的,因此每个线程都会相互访问客户端连接列表并执行请求中的所有操作。

这两部分通过AF_UNIX套接字进行通信,为了互斥,我使用了锁和条件变量。

现在我的问题是:在某些执行交错的情况下,服务器端最终会同时向客户端写两个(实际上服务器中的两个工作线程都向同一个客户端发送消息),这只是一个。对于不幸的交错,客户端只能读取服务器发送的消息之一,但我注意到有时这不会发生并且一切正常,这是因为对客户端的两个不同请求恰好在时间。

即使一个服务器线程在客户端调用read之前执行了写操作,也会发生此问题,并且在这两个事件之间,另一个服务器线程调用另一个写入同一客户端。在这种情况下,客户端只接收最近的写入。

根据我对阻止模式(我正在使用的)的理解,read() and write()应当在没有人从另一方接收时阻止。现在我不明白为什么服务器工作者的第二次写入完全丢失了?如果没有人接收,那么它是否应该阻止,然后在客户端呼叫读取时恢复?

我应该在套接字上使用mutual exclusion,以便第二次写入应该等待前一次写入完全完成吗?

我希望我的问题很明确,即使我没有显示任何代码,如果有必要请告诉我,我会尝试发布一些代码。我认为这个问题可能仅仅是一个概念性的问题,关于我对read(),write()和互斥的理解,但我明白问题可能在其他地方而且没有代码就很难弄明白!谢谢!

0 个答案:

没有答案