delphi 使用线程数组是一件坏事吗?[已关闭]

rqdpfwrv  于 2022-11-04  发布在  其他
关注(0)|答案(2)|浏览(157)

已关闭。此问题为opinion-based。当前不接受答案。
**想要改进此问题吗?**请更新问题,以便editing this post可以用事实与引用来回答.

三个月前关门了。
Improve this question
比方说,我必须对上千个数据做同样的运算,我的想法是:
1.创建一个挂起的TThread数组(创建时传递数据)
1.获取CPU内核数
1.启动 * 核心计数 * 线程,然后等待所有线程完成
1.重复步骤3,直到处理完所有数据
1.获取结果
1.释放线程和数组。
这样做可以吗?

rsaldnfx

rsaldnfx1#

创建一个挂起的TThread数组(创建时传递数据)
我会将数据放入队列中,然后创建与内核数量或队列中的项目数量(取较小者)相同数量的线程,然后让每个线程从队列中拉取数据,直到没有任何数据可拉取。
启动内核计数线程,然后等待所有线程完成
当任何给定的线程完成一个队列项时,如果需要(如果你需要真实的获取结果),它可以通知其余的代码,并从队列中提取下一个项。这样所有的线程都在以最大容量运行。一旦队列为空,你将拥有所有的结果,你可以挂起线程以备将来重用,或者销毁它们。

vu8f3i0k

vu8f3i0k2#

创建数千个线程是一个坏主意。为什么?
创建每个线程示例都会消耗一些内存。因此,创建数千个线程示例会消耗大量内存
根据Maximum threads limit per process in windows 10?中的答案,一个32位应用程序在内存耗尽之前可能只能创建大约2000个线程,这是在这样的应用程序没有使用内存做其他事情的情况下。
最好的方法是创建与计算机上可用内核数量相同的线程,然后在这些线程之间平均分配工作。
或者你可以把工作分配给这些线程,这样可以平衡工作,以防某些线程可能被分配了更多的cpu时间,从而更快地完成工作。

相关问题