gpt4 book ai didi

c - 关于 sockets/tcp-connections 多线程的问题

转载 作者:可可西里 更新时间:2023-11-01 02:36:48 27 4
gpt4 key购买 nike

我有一个服务器,它使用 TCP/IP 连接连接到多个客户端,在 Unix 中使用 C。由于它一次不会超过 20 个连接,我想我会为每个连接/套接字使用一个线程。但问题是写入套接字,因为我将向客户端发送用户提示消息。一旦每个套接字都由一个线程处理,我如何与创建的线程交互以写入套接字?每个线程是否应该只从套接字中读取,然后我将写入主程序中的套接字?不确定这是否是解决问题的好方法。

最佳答案

我的经验法则是任何给定的套接字都只能由单个线程 (*) 操作。因此,如果您为每个套接字生成一个单独的 I/O 线程,并且您的主线程想要将某些内容写入 I/O 线程的套接字,那么主线程应该将该数据发送到 I/O 线程,然后 I/O 线程可以将其写入套接字。

当然,这意味着你需要在主线程和I/O线程之间有一个良好的通信方式;您可以通过为每个 I/O 线程生成一个套接字对并将 I/O 线程 select()/poll() 放在套接字对的末端(以处理来自主线程的数据)来实现就像在他们的网络套接字上一样。

但是一旦你这样做了,你就会处理使用 select()/poll() 和多线程的复杂性,这是一个很大的复杂性开销。因此,除非出于某种原因绝对需要多线程,否则我同意之前的发帖者的观点——最好通过 select() 或 poll() 在单个线程中处理所有套接字。

(*) 多个线程同时读/写同一个套接字是可能的,但它很容易出错。特别是,启动和关闭顺序可能很难做到 100% 正确。这就是为什么我尽量避免在多个线程之间“共享”给定的套接字。

关于c - 关于 sockets/tcp-connections 多线程的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2484918/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com