我正在开发一个需要调度工作负载的跨平台(Windows,Linux和Android)C ++应用程序。需要在单独的线程上调度此工作负载,并且存在异步提交多个工作负载的可能性。应用程序在一个线程上运行,而不是执行脚本的主线程。该脚本将依次执行其他线程上的工作负载提交。由于工作负载在硬件仿真器上运行,因此在此应用程序中时间并不重要。
如果应用程序是时间关键的,我会预先创建一个线程池并循环调度线程上的提交,线程永远不会退出...但是由于该工具不是时间关键且永远不会,我正在考虑创建新的线程并让它们在每次提交时到期,纯粹是为了简单和安排。
我想确定这是否被视为良好做法?我也试图确定每个操作系统的含义:E.G。这在Windows上可能没问题,但可能会导致Android版本4.2出现问题而我不知道。
如果我不应该在每次发送时不断创建新线程,那么我正在寻找可靠的原因,为什么不应该这样做。谢谢你的输入。附:我无法在搜索中找到答案。
答案 0 :(得分:1)
按需创建线程并让它们在提交时过期可能看起来很简单,并且正如其他评论者所建议的那样,经常会这样做。由于以下原因,我几乎没有做过这样的事情:
您必须实际创建线程并正确终止它们。 这可能是非平凡的并且容易出错 - 搜索SO以'终止 一个帖子'帖子 - 有成千上万。终止问题 通过不终止它们可以避免线程。
在实际线程创建/终止方面,创建/终止线程不仅成本更高,而且线程使用的任何类也必须不断创建/销毁。对于某些类而言,这可能代价高昂,并且dtors中的错误可能导致内存泄漏不断增加(不透明库中的类,您无法修复,已知泄漏:)。这可以通过不终止线程来避免,从而避免破坏这些对象。
创建线程需要分配其堆栈。许多OS 分配占用虚拟内存空间的超大型默认堆栈。 这可能是突然到达的“突发”工作负载的问题 大量工作可能导致大量的工作 线程和内存失控。
如果你处于不幸的位置,不得不分享一些 跨线程的资源,线程越多,争用越多 你会拥有这些资源,所以增加花费的时间 等待锁。
未知数量的线程进行调试,这已经是 多线程很难,甚至更难。这是给我的, 是最重要的考虑因素,我几乎可以做任何事情来避免 多个创建/终止/加入模式。
创建/终止/加入因阻止快速关闭而臭名昭着 的应用程序。如果您的PC上有任何设计糟糕的GUI应用程序 请求时不要立即关闭,(我相信你有), join()很可能就是原因。
将任务提交给线程池要安全得多 优选的。
应用程序生命周期线程,即。在app启动时创建,是 致力于某项任务并且从未终止,也很好,并且 日志等一些功能比线程池更适合 任务。
多个创建/终止/加入?试着非常非常难以避免 它。将此模式置于“绝望”类别中:)