创建可暂停/可恢复线程的最佳方法是啥

Posted

技术标签:

【中文标题】创建可暂停/可恢复线程的最佳方法是啥【英文标题】:What is the best way to create suspendable/resumable threads创建可暂停/可恢复线程的最佳方法是什么 【发布时间】:2011-11-13 06:31:41 【问题描述】:

我正在为发送低缓冲区通知的微处理器进行一些网络编程,并且我有一个写入一定数量信息的线程。完成后,它需要进入挂起状态并等待低缓冲区通知恢复。

是使用windows的线程池api,还是使用CreateThread()创建的线程更好?

【问题讨论】:

你需要添加一个windows标签。另外,我怀疑您正在编写 Windows 驱动程序,而不是常规程序?如果是这样,您必须告诉我们,这是一个非常不同的环境。 我添加了 windows 标签。我不认为它在技术上是一个 Windows 驱动程序,因为它只使用 TCP 和 UDP 网络编程,除了可靠的线程控制之外,我还有其他一切工作。如果有兴趣,我正在编程的设备是以太梦:ether-dream.com 【参考方案1】:

当您的线程需要等待时,它应该开始等待某个事件。这会自动挂起线程。

Windows 为此提供了 WaitForMultipleObjects 和 WaitForSingleObject 函数。 Linux 使用条件变量或信号量。

【讨论】:

如果你需要挂起一个不同的线程怎么办?这种方法行不通。 @chacham15:不要设计你的代码,以便你需要暂停其他线程。你设置了一个事件/条件/变量,另一个线程检查它并挂起自己,等待发生一些事情。 这是一个例子,如果我正在编写一个管理 cpu 使用的应用程序怎么办。我希望能够暂停占用 cpu 的线程,以支持属于用户关心的程序的线程。我将如何实现这一目标? 要么删除占用 CPU 的应用程序,要么降低其优先级?低级驱动程序和管理它们的线程之间的通信通常是通过信号量来执行的——在许多操作系统上,不允许最低级别的中断处理程序做很多其他事情。不要靠近明确的暂停/恢复控制。我知道如果您可以对管理器线程说“停止”并确保它没有操纵缓冲区指针等这样您就可以做到这一点,这很容易,但我担心驱动程序编码人员不会得到这种奢华。【参考方案2】:

创建可挂起线程的最佳方法是:

std::thread thread(function, arguments);

如果您想在稍后阶段暂停该线程的执行,您可以使用std::condition_variablestd::condition_variable_anywait() 成员。

【讨论】:

【参考方案3】:

最好使用用 CreateThread 创建的单线程。 ThreadPool 线程旨在执行简单的任务然后返回池中,它们不适用于长时间运行的任务、等待或 I/O 操作。这是因为它们的数量有限,一旦你有一个运行和等待,你就不能在其他地方使用它。

此外,ThreadPool 线程由系统管理,并不意味着可以从外部识别。最好使用经典线程。

【讨论】:

以上是关于创建可暂停/可恢复线程的最佳方法是啥的主要内容,如果未能解决你的问题,请参考以下文章

合并大量小文件以最大化可恢复性的最佳方法是啥

单独线程上的可暂停计时器

如何在 C++ 中暂停和恢复 POSIX 线程?

Thread.sleep是啥意思?有啥作用

线程的挂起和恢复 转载

等待 Completable 未来线程完成的推荐方法是啥