gpt4 book ai didi

c# - 如何验证n个方法是否并行执行?

转载 作者:太空狗 更新时间:2023-10-29 23:06:12 25 4
gpt4 key购买 nike

仅出于知识目的,我如何验证 n 个方法是否并行执行?

Parallel.For(0, 10, i => DoSomething(i));

...

void DoSomething(int par)
{
Console.WriteLine($"Test: {par}");
}

是否有一个测试可以确保 DoSomething 不是按顺序执行的(如果 Console.WriteLine 不是一个好的测试,什么可以是一个非常简单的测试函数?)

最佳答案

在您的示例中,方法肯定是顺序的,因为 .NET 控制台将 synchronize calls from different threads .

但是,您可以使用 Thread.ManagedThreadID 检查正在运行该方法的线程 ID或 Environment.CurrentManagedThreadId (对于 .NET 4.5)

class Program
{
static void Main(string[] args)
{
// first run with default number of threads
Parallel.For(0, 10, i => DoSomething(i));
Console.ReadLine();

// now run with fewer threads...
Parallel.For(0, 10, new ParallelOptions{
MaxDegreeOfParallelism = 2
}, i => DoSomething(i));
Console.ReadLine();
}

static void DoSomething(int par)
{
int i = Environment.CurrentManagedThreadId;
// int i = Thread.ManagedThreadId; -- .NET 4.0 and under
Thread.Sleep(200);
Console.WriteLine("Test: "+ par.ToString() +
", Thread :" + i.ToString());
}
}

如果您在没有 Thread.Sleep 的情况下运行此程序,您会注意到将只使用几个线程,因为调用将足够快地完成,以便线程及时返回到池中以进行选择队列分配的下一个作业。

添加 sleep 将使线程(模拟工作)延迟足够长的时间,以至于线程池将不得不获取更多线程以及时将作业分拆出来。

当并行运行任何任务时,很容易检查这些任务实际上是否都在单独的线程中运行。然而,您是否获得性能优势将取决于这些线程的工作效率。如您所见,某些操作会引起对共享资源的争用(例如写入控制台),并且会阻止您的多个线程同时运行。

其他争用来源可能是,例如,内存分配 - 如果您的线程都在大量分配和取消分配内存,那么它们最终可能会花费大量时间等待内存管理器轮到它们。这将限制您将实现的实际并行度。

关于c# - 如何验证n个方法是否并行执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35503140/

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