线程与并发集合的最佳使用。任务
Optimum use of Concurrent Collections with Threads Vs. Tasks
我一直在阅读 MSDN 上关于 C# 并发集合的 this 文章。它讨论了用于特定场景的最佳线程以从集合中获得最大收益,例如:
ConcurrentQueue performs best when one dedicated thread is queuing and one dedicated thread is de-queuing. If you do not enforce this rule, then Queue might even perform slightly faster than ConcurrentQueue on computers that have multiple cores.
当使用任务而不是原始线程时,此建议是否仍然有效?根据我对 C# Tasks 的(有限的)理解,不能保证特定的 Task 在上下文切换之间总是 运行 在同一个线程上,或者维护堆栈帧是否意味着相同的规则适用于最佳使用?
谢谢。
一个任务总是在同一个线程上运行。 TPL 是一个用户模式库。用户模式没有(实用的)方法将执行代码从一个线程迁移到另一个线程。这样做也没有意义。
这条建议完全适用于任务,就像它适用于线程一样。
那条建议的意思是同时应该只有一个生产者和一个消费者。只要不争用,您可以不时地让 100 个线程排队。
(我不是在这里质疑这个建议,因为这超出了这个问题的范围。但这就是这里的意思。)
我一直在阅读 MSDN 上关于 C# 并发集合的 this 文章。它讨论了用于特定场景的最佳线程以从集合中获得最大收益,例如:
ConcurrentQueue performs best when one dedicated thread is queuing and one dedicated thread is de-queuing. If you do not enforce this rule, then Queue might even perform slightly faster than ConcurrentQueue on computers that have multiple cores.
当使用任务而不是原始线程时,此建议是否仍然有效?根据我对 C# Tasks 的(有限的)理解,不能保证特定的 Task 在上下文切换之间总是 运行 在同一个线程上,或者维护堆栈帧是否意味着相同的规则适用于最佳使用?
谢谢。
一个任务总是在同一个线程上运行。 TPL 是一个用户模式库。用户模式没有(实用的)方法将执行代码从一个线程迁移到另一个线程。这样做也没有意义。
这条建议完全适用于任务,就像它适用于线程一样。
那条建议的意思是同时应该只有一个生产者和一个消费者。只要不争用,您可以不时地让 100 个线程排队。
(我不是在这里质疑这个建议,因为这超出了这个问题的范围。但这就是这里的意思。)