首页 > 解决方案 > c++线程创建/删除vs线程停止/恢复

问题描述

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

例如 50ms thead 做某事 -> 20ms main 做某事 -> 50ms thread 某事 -> 20ms main 什么也不做....

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

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

当我使用线程恢复/停止策略时,我使用了 conditional_variable、mutex 和 condition_variable.wait()。

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

标签: c++multithreadingmutexcondition-variable

解决方案


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

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

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


推荐阅读