C++ 线程创建/删除与线程停止/恢复

c++ thread create/delete vs thread stop/resume

本文关键字:线程 恢复 删除 创建 C++      更新时间:2023-10-16

我正在编写仅使用 1 个线程的应用程序(主线程除外(。 线程的寿命很短,例如 50 毫秒。 但是,它应该每秒发生多次。 除了激活时间之外,线程应该停止,主线程应该正在运行。

例如,50ms thead 做某事 -> 20ms 主要做某事 ->50ms 线程某事 -> 20ms 主要什么都不做....

我首先认为线程恢复/停止会很好。 但是,它比线程创建/销毁更好吗? 像

线程创建 ->线程删除 ->线程创建 ->线程删除...... 当我使用线程创建/销毁策略时,我使用线程构造函数和 thread.join(( 来完成,并使用 1 个原子变量来知道何时完成。

当我使用线程恢复/停止策略时,我使用了conditional_variable,互斥体和condition_variable.wait((。

我预计线程恢复/停止策略具有更好的性能。 但是,它看起来不像那样。 看起来两者的性能和内存/CPU 使用率几乎相同。

在操作系统级别创建线程通常确实需要相当多的开销。但是创建一个 std::thread 对象不一定相同。后一种操作可能包括仅从线程池请求线程,并销毁将线程返回,而操作系统线程本身永远不会停止存在。

在这种情况下,您不会看到这两种方法之间的太大区别,因为真正完成的所有工作(在操作系统级别(都是将线程添加到线程调度算法中,并在这两种情况下将其删除(除非池用完线程并且也需要在操作系统级别创建新线程(。仍然存在的微小差异可能小于线程必须等待 CPU 内核的时间,因为在典型的现代操作系统上,您的线程比内核多得多,因此您可能根本无法注意到任何差异。

仍然只是暂停恢复线程是可取的。您不依赖于线程池来获得相同的性能,并且如果您将代码移植到某些不使用线程池(或已关闭(的操作系统,那么您仍然(有点(以这种方式维护自己的线程池......