我有一台服务器使用TCP / IP连接连接到多个客户端,在Unix中使用C语言。由于它一次不会有超过20个连接,我想我会在每个连接/套接字上使用一个线程。但问题是写入套接字,因为我将向客户端发送用户提示的消息。一旦每个套接字由一个线程处理,我如何与创建的线程交互以写入套接字?每个线程应该只从套接字读取,我会写入主程序中的套接字?不确定这是不是一个很好的方法。
答案 0 :(得分:2)
听起来你可能会更好地使用单个线程并多路复用套接字(使用select,poll等)。这样可以避免竞争条件和锁定要求,否则会使程序更难编写。
除非您正在进行大量处理器密集型工作,或者代表这些客户等待IO,否则无论如何都无法使用线程,但竞争条件仍然存在。
所以我会说,使用单个线程获得一个有效的实现,那么如果在性能测试中发现它缺乏,那么重构它以使用多线程,如果这似乎是击败性能问题的最佳选择(当然你会分析它等等。)
答案 1 :(得分:2)
我的经验法则是任何给定的套接字只能由一个线程(*)操作。因此,如果您为每个套接字生成一个单独的I / O线程,并且您的主线程想要写入I / O线程的套接字,那么主线程应该将该数据发送到I / O线程,然后I / O线程可以把它写到套接字。
当然,这意味着您需要在主线程和I / O线程之间建立良好的通信方法;您可以通过为每个I / O线程生成一个套接字对,并在套接字对的末端(处理来自主线程的数据)上具有I / O线程select()/ poll()来完成就像在他们的网络插座上一样。
但是一旦你完成了这个,你就会处理使用select()/ poll()和多线程的复杂性,这是很多复杂的开销。因此,除非您出于某种原因绝对需要多线程,否则我同意之前的海报 - 最好通过select()或poll()来处理单个线程中的所有套接字。
(*)可能有多个线程同时读/写同一个套接字,但它容易出错。特别是,启动和关闭序列可能很难获得100%正确。这就是为什么我试图避免在多个线程中“共享”给定套接字。
答案 2 :(得分:1)