【发布时间】:2018-02-20 14:03:34
【问题描述】:
我有一个使用工作线程池实现的客户端/服务器应用程序。 在服务器的主程序中,我创建了一个侦听器套接字,然后对于每个客户端,我使用 accept() 获得一个 fd 来处理客户端的请求。 我的问题是:我是否需要锁定这个 fd 才能读取客户的请求并写入答案和数据?
【问题讨论】:
标签: sockets server locking client mutual-exclusion
我有一个使用工作线程池实现的客户端/服务器应用程序。 在服务器的主程序中,我创建了一个侦听器套接字,然后对于每个客户端,我使用 accept() 获得一个 fd 来处理客户端的请求。 我的问题是:我是否需要锁定这个 fd 才能读取客户的请求并写入答案和数据?
【问题讨论】:
标签: sockets server locking client mutual-exclusion
不。侦听器套接字是协调点,您不需要显式协调。甚至不清楚“锁定”套接字是什么意思。套接字不会“锁定”。它们可能会或我不会“阻塞”,具体取决于它们的配置方式——这将决定您的操作是在给定的超时后立即返回,还是无限期地等待完成。
当您成功accept() 侦听套接字时,结果是第二个套接字 - 这是您用来与客户端通信的套接字,而不是侦听器套接字。
当然,如果您的应用程序是多线程的,您的 /threads/ 可能需要锁定或互斥体才能获得正确的行为。细节将根据您的实际设计而有所不同,并且套接字 IO 状态与线程交互的方式可能会变得非常复杂/棘手。您需要发布代码以获得更具体的答案。
甚至单线程套接字 IO 也有更多细节。见https://cis.temple.edu/~giorgio/old/cis307s96/readings/docs/sockets.html
【讨论】: