海南三亚天气:并发系列64章(并行编程)第五章

admin 2个月前 (07-30) 科技 43 1

前言

并行编程,先来看下观点。并行编程用于剖析盘算密集型的义务片断,并将它们分配给多个线程。

划重点,这个是盘算密集型的器械,而不是IO密集型。也就是说切割成的片断用于盘算使用cpu盘算,而不是内存。

若是一个操作时内存密集型那么并行处置是会起反的效果的,由于io意味着守候。原本守候一段的,现在每一段都要守候。

数据的并行处置

class Program
{
	static void Main(string[] args)
	{
		List<int> intlist = new List<int>();
		intlist.Add(1);
		intlist.Add(2);
		intlist.Add(3);
		intlist.Add(4);
		RotateMatrices(intlist);
		Console.ReadKey();
	}
	private static void RotateMatrices(List<int> intlist)
	{
		Parallel.ForEach(intlist, arg =>
		{
			Console.WriteLINE(Thread.CurrentThread.ManagedThreadId.ToString());
		});
	}
}

效果是:

上述得出一个结论,不是说并行的每一个都是在差别线程中,而是说并行的义务可能在统一线程。

注重:由于可能在差别线程中,对于公共变量注重锁。

并行聚合

上述并行中,现在有一个需求就是,让他们并行加上某个数,并得出他们的效果。

class Program
{
	static void Main(string[] args)
	{
		List<int> intlist = new List<int>();
		intlist.Add(1);
		intlist.Add(2);
		intlist.Add(3);
		intlist.Add(4);
		var reuslt=RotateMatrices(intlist);
		Console.WriteLine(reuslt);
		Console.ReadKey();
	}
	private static int RotateMatrices(List<int> intlist)
	{
		object mutex = new object();
		int result = 0;
		Parallel.ForEach(source: intlist, localInit: () => 1, body: (item, state, localvalue) =>
			   {

				   Console.WriteLine(Thread.CurrentThread.ManagedThreadId.ToString());
				   return item + localvalue;
		},
		localFinally: localresult =>
		{
			lock (mutex)
			{
				result += localresult;
			}
		}
		);
		return result;
	}
}

localInit: () => 1 设置了为1,然后并行执行了body部门,最后得出效果相加。

从上面可以得出,并行编程其实是壅闭的。若是要到达更好的效果,需要连系异步编程。

上面另有个state 没有用上:

(item, state, localvalue)

这个state 可以 state.stop(); 住手

state.break() 跳出循环。

上面这样盘算是有问题的:

class Program
{
	static void Main(string[] args)
	{
		List<int> intlist = new List<int>();
		for (int i = 0; i < 1000; i++)
		{
		intlist.Add(1);
		intlist.Add(2);
		intlist.Add(3);
		intlist.Add(4);
		}
		var reuslt=RotateMatrices(intlist);
		Console.WriteLine("查看result:"+reuslt);
		Console.ReadKey();
	}
	private static int RotateMatrices(List<int> intlist)
	{
		object mutex = new object();
		int result = 0;
		Parallel.ForEach(source: intlist, localInit: () => 1, body: (item, state, localvalue) =>
			   {
				   Console.WriteLine(Thread.CurrentThread.ManagedThreadId.ToString());
				   return item + localvalue;
		},
		localFinally: localvalue =>
		{
			lock (mutex)
			{
				result += localvalue;
			}
		}
		);
		return result;
	}
}

第一次的效果:

第二次的效果:
海南三亚天气:并发系列64章(并行编程)第五章  第1张

两次效果不一致。

惊喜不惊喜开心不开心?

刚开始我也很渺茫,厥后看了一下群里的大佬点播了一下。

请跑一下下面的,一切都市很清晰的。

private static int RotateMatrices(List<int> intlist)
{
	object mutex = new object();
	int fornumber = 0;
	int tasknumber = 0;
	int result = 0;
	Parallel.ForEach(source: intlist, localInit: () => 1, body: (item, state, localvalue) =>
		   {
			   Console.WriteLine(Thread.CurrentThread.ManagedThreadId.ToString());
			   Console.WriteLine("查看localvalue:"+ localvalue);
			   Console.WriteLine("item:"+item);
			   Interlocked.Add(ref fornumber, 1);
			   return item+localvalue;
		   },
	localFinally: localvalue =>
	{
		Console.WriteLine("查看Tasklocalvalue:" + localvalue);
		lock (mutex)
		{
			result += localvalue-1;
		}
		Interlocked.Add(ref tasknumber, 1);
	}
	);
	Console.WriteLine("fornumber:"+fornumber);
	Console.WriteLine("tasknumber:" + tasknumber);
	return result;
}

重点部门我画了红字:

海南三亚天气:并发系列64章(并行编程)第五章  第2张

海南三亚天气:并发系列64章(并行编程)第五章  第3张

简化版:

intlist.AsParallel().Sum();

intlist.AsParallel().Aggregate(seed: 0, func: (sum, item) => sum + item);

下一章

我整理了一些:

1.并行挪用

2.动态并行

3.并行Linq

,

SuNBet

Sunbet是Sunbet指定的Sunbet官网,Sunbet提供Sunbet(Sunbet)、Sunbet、申博代理合作等业务。

Sunbet声明:该文看法仅代表作者自己,与本平台无关。转载请注明:海南三亚天气:并发系列64章(并行编程)第五章

标签列表

    文章归档

      站点信息

      • 文章总数:339
      • 页面总数:0
      • 分类总数:8
      • 标签总数:658
      • 评论总数:54
      • 浏览总数:1369