我有一个用 C++ 编写的 Windows 服务,用作监听传入连接的 TCP 服务器。
我初始化了服务器套接字并将accept
代码放入单独的线程中。这将接受并处理传入的连接。
但是,我还需要停止该线程,以防服务收到停止信号。所以我想到使用 CreateEvent 创建一个事件对象并等待它收到信号。这种等待将发生在创建接受线程的线程中。因此,我可以使用 TerminateThread
函数在收到 STOP 信号时停止接受线程。
但是,MSDN说的是
TerminateThread is a dangerous function that should only be used in the most extreme cases.
应该如何严格地遵循这一点,我的方法是否正确?还有什么方法可以做到这一点?
最佳答案
在 Windows 中,您只需调用 closesocket
即可唤醒来自另一个线程的阻塞 accept
调用。阻塞 accept
调用将返回 -1,并且您的代码有机会通过检查您已经设置的其他退出条件(例如全局变量)来打破它所在的任何循环
这也适用于带有 close
函数的 Mac(以及可能的 BSD 衍生版本),但不适用于 Linux。针对此问题的更通用的 UNIX 解决方案是 here .
下面的 Windows 解决方案的一些伪代码。
SOCKET _listenSocket;
bool _needToExit = false;
HANDLE _hThread;
void MakeListenThreadExit()
{
_needToExit = true;
closesocket(_listenSocket);
_listenSocket = INVALID_SOCKET;
// wait for the thread to exit
WaitForSingleObject(_hThread, INFINITE);
}
DWORD __stdcall ListenThread(void* context)
{
while (_needToExit == false)
{
SOCKET client = accept(_listenSocket, (sockaddr*)&addr, &addrSize);
if ((client == -1) || _needToExit)
{
break;
}
ProcessClient(client);
}
return 0;
}
关于c++ - 在 Windows C++ 服务中阻止两个线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26010024/