【发布时间】:2010-12-03 00:34:15
【问题描述】:
我有一个异步应用程序执行多个线程在套接字上执行操作,这些操作被调度然后异步执行。
我试图避免这样的情况:一旦在套接字上安排了读取操作,在第一个操作开始执行之前,套接字会关闭并重新打开(可能由另一个操作中的另一个对等方),这将最终读取正确的文件描述符但错误的对等点。
问题来了是因为 (accept();close();accept()) 在两个 accept() 中返回相同的 fd,这可能导致上述情况。
我看不出有什么办法可以避免。
有什么提示吗?
【问题讨论】:
-
为什么连接到一个线程的套接字被另一个线程关闭了?
-
这就是异步系统的本质,一个操作读取,另一个写入,另一个可能关闭,所有这些操作都可能在不同的线程中执行。
-
重新考虑您的方法。通常有一个线程接受连接,并产生线程来处理它们。然后这些线程负责关闭连接,并且没有其他线程可以访问该连接。
-
我不认为 Omry 真的错了——他的观点是多个线程访问同一个套接字会带来痛苦的世界。拥有 1 个线程处理 1 个套接字的所有访问权限并不意味着您不能让 1 个线程处理多个套接字。
-
好吧,有了 NIO(非阻塞 IO,选择/轮询和朋友),您甚至不需要多个线程来处理套接字。
标签: c++ linux multithreading sockets