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

标签 c++ windows multithreading service tcpserver

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

相关文章:

windows - 如何避免 "Windows Defender SmartScreen prevented an unrecognized app from starting warning"

c# - 无法生成临时类(结果=1)有什么想法吗?

Ruby:并发/多线程任务的 CPU 负载下降?

java - 跳过 181 帧... Android

c++ - 为什么有些线程会延迟?

c++ - 调用 delete[] 会破坏我的 C++ 程序

c++ - 我如何将 Octave (matlab 克隆)与 qt creator 集成

Linux 子系统 ssh 看不到 id_rsa.pub

c++ - 将字符串格式化为科学记数法

python - 用于 Win32 平台的 CMake find_package(需要 PythonInterp 3.7)