gpt4 book ai didi

multithreading - 任务并行库回收中使用中的线程

转载 作者:行者123 更新时间:2023-12-03 13:21:55 26 4
gpt4 key购买 nike

我们的系统会在写入的每条消息中写入ManagedThreadID,多年来,我们一直在使用它来帮助区分日志中的特定工作单元。到目前为止,一切都很好。

现在,我们开始使用任务并行库并注意到一个有趣的效果:

    public static void Main(string[] args) {
WriteLine("BEGIN");

Parallel.For(0, 32, (index) => {
WriteLine(" Loop " + index.ToString());

});

WriteLine("END");
}

输出如下所示:
ThreadID=1, Message=BEGIN
ThreadID=1, Message= Loop 0
ThreadID=3, Message= Loop 16
ThreadID=3, Message= Loop 17
...
ThreadID=4, Message= Loop 4
ThreadID=4, Message= Loop 5
ThreadID=1, Message= Loop 8
ThreadID=1, Message= Loop 9
ThreadID=1, Message= Loop 10
ThreadID=3, Message= Loop 21
ThreadID=4, Message= Loop 6
...
ThreadID=3, Message= Loop 24
ThreadID=3, Message= Loop 25
ThreadID=1, Message= Loop 11
ThreadID=1, Message= Loop 12
ThreadID=1, Message= Loop 13
ThreadID=1, Message= Loop 31
ThreadID=3, Message= Loop 26
...
ThreadID=3, Message= Loop 30
ThreadID=1, Message=END

您会注意到,有时主线程的ThreadID(标记为“BEGIN”)在Loop线程中回收。

我的问题是:这是否可能发生在其他任何地方-例如线程池或使用Task Parallel Library的其他功能?我花了很多时间试图找出其他方式来挑衅该行为,并且不能。

这里的问题是,如果我们不能再依赖ThreadID(我们有很多工具可以依靠这种行为),那么我们将避免使用Parallel.For。但是,如果问题将以其他方式体现出来,那么我们需要弄清楚如何避免它们,直到我们重新调整日志记录策略和工具支持。

如果还有其他引发行为的方式,我想了解一下,以便确定我们的使用情况是否满足此类条件,以便我们进行相应的纠正。更重要的是,因此我可以获得一个示例程序来激发这种行为并研究我们工具中的任何副作用。

最佳答案

实际上,Parallel.For在调用线程上运行辅助任务之一。理由是,由于调用线程必须等待并行循环完成,因此它可能还参与并行操作。

就任务并行库的其他功能而言,阻塞的方法通常会使用调用线程。因此,Parallel.For,Parallel.ForEach,Parallel.Invoke和阻塞PLINQ查询都将重新使用调用线程作为工作线程之一。另一方面,仅“启动”某些工作并立即返回的操作(例如Task.Factory.StartNew,Threadpool.QueueUserWorkItem和非阻塞PLINQ查询)不能使用调用线程。

解决方法是,可以在任务内部运行Parallel.For并等待该任务:

public static void Main(string[] args) {
WriteLine("BEGIN");
Task.Factory.StartNew(() =>
Parallel.For(0, 32, (index) => {
WriteLine(" Loop " + index.ToString());
})
).Wait();
WriteLine("END");
}

警告:如果从ThreadPool线程调用Task.Factory.StartNew(),则上述解决方法将不起作用。在这种情况下,Wait调用可能最终在调用ThreadPool线程上内联执行任务。

关于multithreading - 任务并行库回收中使用中的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5826827/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com