有关套接字/ tcp连接的多线程的问题

时间:2010-03-20 21:50:06

标签: c multithreading unix sockets tcp

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

3 个答案:

答案 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)

让主线程写入套接字很好,你只需要担心多个线程同时写入套接字。

但是,在使用多线程方法之前,我会测试使用单个线程和select / poll的性能。