gpt4 book ai didi

c++ - 在 Windows C++ 服务中阻塞两个线程

转载 作者:可可西里 更新时间:2023-11-01 10:05:51 26 4
gpt4 key购买 nike

我有一个用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com