I have a server that connects to multiple clients using TCP/IP connections, using C in Unix. Since it won’t have more than 20 connections at a time, I figured I would use a thread per connection/socket. But the problem is writing to the sockets as I’ll be sending user prompted msgs to clients. Once each socket is handled by a thread, how do I interact with the created thread to write to the sockets? Should each thread just read from the sockets and I’ll write to sockets in the main program? Not sure if that’s a good way to go about it.
I have a server that connects to multiple clients using TCP/IP connections, using C
Share
My rule of thumb is that any given socket should only be operated on by a single thread(*). So if you spawn a separate I/O thread for each socket, and your main thread wants something written to an I/O thread’s socket, then the main thread should send that data to the I/O thread, whereupon the I/O thread can write it to the socket.
Of course, this means you need to have a good communications method between the main thread and the I/O thread; which you could do by spawning a socket-pair for each I/O thread and having the I/O threads select()/poll() on their end of the socket-pair (to handle data coming from the main thread) as well as on their network socket.
But once you’ve done that, you’re dealing with complexity of using select()/poll() AND multithreading, which is a lot of complexity overhead. So unless you absolutely need multithreading for some reason, I agree with the previous posters — it’s better to just handle all the sockets in a single thread, via select() or poll().
(*) It’s possible to have multiple threads reading/writing to the same socket at the same time, but it’s error-prone. In particular, startup and shutdown sequences can be tricky to get 100% right. That’s why I try to avoid ‘sharing’ a given socket amongst multiple threads.