【发布时间】:2017-04-06 18:06:14
【问题描述】:
我对线程池效率有疑问。我不确定我是否理解整个概念。在问这个问题之前我做了很多阅读,我知道如果你有很多小的、相对快速的函数并且更重要的是非阻塞任务,线程池是一个很好的解决方案。在线程池中使用lock 非常糟糕。
这是我的问题:如何从线程池函数返回值?如果你有 functions 来运行它们可能会产生一些结果,对吧?最好将这些结果存储在某个地方。 在哪里?
我正在运行 c.a.线程池中有 200k 个非常快速的函数。我将结果存储在List 中。我当然必须这样做:
lock(lockobj)
{
myList.Add(result);
}
那么,这是正确的方法吗?我的意思是,如果你的 functions 返回一些东西,你必须将它们存储在某种集合中。它必须是一个阻塞集合。所以,我开始想……“线程池中的阻塞非常小,但你必须这样做,至少一次 - 在每个函数的末尾
如何存储/返回线程池中运行的函数的结果?
谢谢! JB
编辑:“功能”我的意思是......
ThreadPool.QueueUserWorkItem(state =>
{
Result r = function(); // previously named "Task"
lock(lockobj)
{
allResults.Add(r);
}
}
【问题讨论】:
-
是的,它是正确的方式。计时,这应该是您进行任何性能调整的基准。如果您发现无锁方式也可以测量它们。始终衡量您是否有性能调优的想法。始终有一个基线(最简单的工作代码)
-
你试过
ConcurrentBag吗? -
如果您对锁写不正确有任何疑问,可以使用
ConcurrentQueue。 -
你几乎不需要直接访问线程池;您应该使用构建在它之上的更高级别的工具。您使用哪种工具将取决于您实际的高阶操作是什么。
-
@Bem,您正在交替使用
Task和ThreadPool,您知道它们是不同的东西吗?Task可能最终成为一个线程,但很可能不会。这是由 .NET 框架管理的。至于线程安全的集合,前面的评论已经回答过了。
标签: c# .net multithreading task-parallel-library threadpool