开发者

Signaling all active threads (Windows)

开发者 https://www.devze.com 2023-03-26 07:31 出处:网络
I am faced with a design issue regarding thread synchroni开发者_如何学Gozation in C++, Windows.

I am faced with a design issue regarding thread synchroni开发者_如何学Gozation in C++, Windows.

I am writing a server application that starts one listening thread, which should stay active the whole time while the server is up. When the listening thread gets a connect request, it opens a CONTROL socket and starts a new control thread. This thread is used to send control data between server and a client, initializing server and all the background software to specific client data and starting data processing.

If the initialization (via control socket) is successful, the control thread will open a new socket, DATA socket, which is then used to pass data from server to client. It will also start two new threads, one which is sending on this new, DATA socket, and the other, which is receiving on the CONTROL socket, waiting if the client wants to terminate connection.

When client terminates connection ungracefully, by terminating application without the call to function which sends the server message to close the connection, here is what should happen:

  • Any of the threads in execution can detect this event. They will get some sort of error (WSAECONNRESET) while sending or receiving on DATA/CONTROL socket and should then signal all the other threads that they should stop executing (except for the server listening thread).

Which is the most natural way to achieve this type of behavior?

(I am using winsock (winsock2.h) for networking, and standard windows api (windows.h) for threading)


If you're writing a multi-threaded winsock server, you should be looking into IO completion ports. Using an IO completion port is the most scalable way to write a network service on the windows platform.

IO completion port based winsock servers use asynchronous communication, so instead of blocking on a socket, your threadpool receives completion packets when something interesting happens.

In any case, you'll be using WSARecv. When WSARecv returns non zero, call WSAGetLastError(). If you don't have WSA_IO_PENDING, then switch on the error and look for the winsock error code you're interested in.

The winsock error code WSA_OPERATION_ABORTED indicates that a socket has closed, although there are others (e.g. WSAECONNABORTED).

Would suggest a good text on the subject (e.g. Windows via C/C++).


You can use WSAEventSelect() function to associate event object with socket and create one event object for your events, then use these event objects in WaitForMultipleObjects() function, so your thread can wait for socket events and your custom events.

0

精彩评论

暂无评论...
验证码 换一张
取 消