【问题标题】:c++ thread create/delete vs thread stop/resumec ++线程创建/删除与线程停止/恢复
【发布时间】:2020-04-18 23:24:57
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 并非每个例程/函数/方法/运算符都有标签。请从列表中选择标签并阅读他们的维基。标记join 用于关系数据库运算符。
  • 最好使用后一种方法。线程创建是一项昂贵的操作,因此最好使用第二种方法。
  • 我还希望保留线程可以减少工作量,但运行时可能不会每次都给你一个新线程。它可能有一个隐藏在 deepdark 中的线程池,只是一遍又一遍地重复使用相同的线程而不告诉你。
  • 每个应用程序至少有一个线程,它是执行main() 的线程。我猜你的第一段是想说你开始一个额外的线程,对吧?
  • @Ulrich 是的,包括主线程,总共有2个线程。

标签: c++ multithreading mutex condition-variable


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多