android - 良好做法 : Continually create threads or reuse threads

标签 android c++ linux windows multithreading

我正在开发一个需要分派(dispatch)工作负载的跨平台(Windows、Linux 和 Android)C++ 应用程序。此工作负载需要在单独的线程上分派(dispatch),并且存在异步提交多个工作负载的可能性。应用程序在执行脚本的线程上运行,而不是在主线程上运行。该脚本反过来将在其他线程上执行工作负载提交。时间在此应用程序中并不重要,因为工作负载在硬件模拟器上运行。

如果应用程序是时间关键的,我会预先创建一个线程池并周期性地在线程上分发提交,这些线程永远不会退出...但是由于该工具不是时间关键的而且永远不会,我正在考虑创建新的线程并让它们在每次提交时过期纯粹是为了简单和安排。

我想确定这是否被认为是好的做法?我也在尝试确定对每个操作系统的影响:E.G.这在 Windows 上可能没问题,但可能会导致我不知道的 Android 4.2 版问题。

如果我不应该在每次分派(dispatch)时不断地创建新线程,那么我正在寻找不应该这样做的可靠理由。感谢您的输入。附言我无法在搜索中找到此答案。

最佳答案

按需创建线程并让它们在提交时过期似乎很简单,而且正如其他评论者所建议的那样,通常是这样做的。我几乎没有做过这样的事情,原因如下:

  • 您必须实际创建线程并正确终止它们。 这可能很重要并且容易出错 - 在 SO 中搜索“终止” 一个线程的帖子 - 有数千个。终止问题 可以通过不终止它们来避免线程。

  • 不仅创建/终止线程的实际线程创建/终止成本更高,而且线程使用的任何类也必须不断创建/销毁。对于某些类来说,这可能代价高昂,dtor 中的错误可能会导致不断增加的内存泄漏,(不透明库中的类,您无法修复,已知会泄漏:)。这可以通过不终止线程来避免,从而避免破坏此类对象。

  • 创建一个线程需要分配它的堆栈。许多操作系统 分配过大的默认堆栈会占用虚拟内存空间。 这可能是突然到来的“突发”工作负载的问题 大量工作的结果可能会导致数量多得离谱 线程和内存失控。

  • 如果您不幸不得不分享一些 资源跨线程,线程越多,争用越多 您将拥有这些资源,因此增加了花费的时间 等待锁。

  • 未知数量的线程进行调试,这已经是 多线程很难,甚至更难。这是给我的, 是一个压倒一切的考虑,我几乎会做任何事情来避免 多个创建/终止/加入模式。

  • Create/terminate/join 因阻止提示关闭而臭名昭著 的应用程序。如果您的 PC 上有任何设计糟糕的 GUI 应用程序 不要在请求时立即关闭,(我相信你有), join() 很可能是这个原因。

    提交任务到线程池更安全 首选。

    应用程序生命周期线程,即。在应用程序启动时创建,是 致力于某些任务并且永不终止,也很好,对于 某些功能(如日志记录)比线程池更适合 任务。

    多个创建/终止/加入?只是非常非常努力地避免 它。将此模式归入“绝望”类别:)

关于android - 良好做法 : Continually create threads or reuse threads,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22122607/

相关文章:

c - wait(NULL) 不会等到 fork 进程完成

linux - 如何计算所服务的http请求的质量

Android gridview 适配器为零位置调用多个 getview()

android - 如何在 TextView 中为文本制作边框?

C++ 如何重载一个函数,该函数将不同模板对象的迭代器作为参数?

c++ - 在 STL 集中设置 lower_bound

linux - 同时在同一操作系统上运行的两个终端窗口可以相互通信吗?

android - recyclerView 中的无限滚动转到第一个元素,然后重新加载 json 适配器

java - 背景可绘制对象未在真实设备中显示

java - 如何在 iOS 上的 Turbo 模块中发出事件