【问题标题】:How to properly close worker threads created for using IOCP如何正确关闭为使用 IOCP 而创建的工作线程
【发布时间】:2012-07-25 04:21:13
【问题描述】:

这是来自Microsoft Windows 网络编程的代码sn-p:

...
// Determine how many processors are on the system.
GetSystemInfo(&SystemInfo);

// Create worker threads based on the number of
// processors available on the system. For this
// simple case, we create one worker thread for each
// processor.

for (int i = 0; i < SystemInfo.dwNumberOfProcessors; i++)
{
    // Create a server worker thread, and pass the
    // completion port to the thread. NOTE: the
    // ServerWorkerThread procedure is not defined
    // in this listing.

    HANDLE ThreadHandle = CreateThread(NULL, 0, ServerWorkerThread, CompletionPort, 0, NULL);

    // Close the thread handle
    CloseHandle(ThreadHandle);
}
...

我不明白为什么示例会直接关闭线程句柄。是否不需要存储它们(例如在 std::vector 中),以便稍后退出程序时终止所有工作线程?

【问题讨论】:

  • 仅当您确实想在以后退出程序时显式终止所有工作线程时。如果您不需要,那么保留任何此类参考是没有意义的。在 IOCP 服务器中,我不会尝试进行任何此类清理。
  • 更重要的是,仅当您需要线程句柄以执行特定于线程的操作时,例如 TerminateThread(永远不要这样做,顺便说一句)或更可能的原因:WaitForSingle/MultipleObject(s) .在后一种情况下,当线程终止时,会发出句柄信号。如果您不需要它来执行此操作或任何类似的操作,则需要将其关闭,最好在打开后立即关闭。

标签: c++ sockets network-programming asyncsocket iocp


【解决方案1】:

没有必要。来自msdn on CloseHandle

关闭线程句柄不会终止关联的线程或 删除线程对象。关闭进程句柄不会终止 关联的进程或删除进程对象。 删除一个 线程对象,必须终止线程,然后关闭所有句柄 到线程。 有关详细信息,请参阅终止线程。到 删除进程对象,必须终止进程,然后关闭 进程的所有句柄。有关详细信息,请参阅终止 处理。

实际上,自包含线程通常在创建时立即关闭其句柄,这允许在线程退出时释放资源。

【讨论】:

  • @yuri-但是如何在没有句柄的情况下显式终止线程?
  • @jpen - 我认为这是不可能的,除非你实现一些机制来通知你的线程退出(无论如何你都应该这样做,因为 TerminateThread 是一件非常糟糕的事情,它不会清理资源)
  • 是的,你可以使用一个单独的变量/事件/whatever 来通知线程在需要时终止。
猜你喜欢
  • 1970-01-01
  • 2016-12-23
  • 1970-01-01
  • 2011-04-26
  • 2013-06-08
  • 1970-01-01
  • 1970-01-01
  • 2013-05-22
  • 1970-01-01
相关资源
最近更新 更多