在.net framework4.0以后,出现了并行编程的概念,使用 Parallel.For(0, N, i =>{ ... },很容易就可以实现我们自定义的并行化循环操作,在并行循环体中,还可以操作外部的变量,这个特性是很多其他语言所没有的,当然其他语言,诸如JAVA之类,完全可以采用我们在第二篇所介绍的方法自己生成并行化操作。
由于.net framework使用环境的局限性,以及“庞大的身躯”,和安装时必须向微软“报到”的限制。很多开发商并不喜欢用,完全可以采用我所介绍的方式实现并行化,与微软的并行化的区别只是他的循环体是使用了lamda表达式,而我的方式是使用委托而已。再发散一下,我个人认为微软的并行化操作在并行化优化方面,多处理器利用方面会更有优势些,性能会更好。
但.Net FrameWork中对并行化并行化的最大线程数貌似并没有进行个性化限定,运行起来自然是并行任务能开多少开多少了。就并行线程数的问题,我们在某个项目中做了一个实验,具体的并行任务中既有数据库操作,又有通信操作,还包括了若干锁定资源操作,以下就是实验结果:
最大线程数
|
程序平均执行时间
|
单线程
|
31470 ms
|
15线程
|
20042 ms
|
5线程
|
20307 ms
|
3线程
|
18745 ms
|
2线程
|
18523 ms
|
从这个有趣的实验结果可以看出,某些应用下,似乎线程数越多,执行时间反而越慢了, 很多情况下,并行化的程序性能可能反而不如顺序执行,甚至会出现一些死锁等问题,这在微软的说明中提到了很多(见
http://technet.microsoft.com/zh-cn/magazine/dd997392(VS.110).aspx),从这篇文章,我们可以看到,影响性能的因素主要有两大类:
1. 对共享资源的锁定问题:这个问题比较好理解,如果多个并行任务尝试操作被锁定的内存位置,那么后来的肯定要等待,对于考虑不很周到的代码,其结果就是比串行机制还慢.
2. 循环体内的对象运行机制问题
在微软的说明中,提到了“不安全的对象”并行化的问题,比如filestream, ui对象等,
另一个有趣的操作是数据库操作及通信操作, 其特征是自身就具有不可控的性能瓶颈,最好通过优化数据库的命令,如连表查询、存储过程等处理。
但对于懒人,或者不需要再精细优化的情况下,并行任务占据的线程数越少,对整体资源及其他任务的影响也越少,所以我们可以对已经封装的并行化类进行一下最大线程数的限制:
class ParaLoop
{
....
private int _MaxThreadQty;
private int _CurrentThreadQty;
private ManualResetEvent ReqThreadEvent = new ManualResetEvent(false);
private object _SynthreadQty = new object();
public ParaLoop(int mtq)
{
_MaxThreadQty = mtq;
}
private void ReleaseThread() //使用完后释放线程,并通知可以申请新线程
{
lock (_SynthreadQty )
{
_CurrentThreadQty--;
ReqThreadEvent.Set();
}
}
~ParaLoop()
{
ReqThreadEvent.Set();
}
private MyParaThread RequestThread() // 申请线程,如果达到最大数则等待,直到有新的线程可用
{
lock (_SynthreadQty)
{
if (_CurrentThreadQty < _MaxThreadQty)
{
_CurrentThreadQty++;
return new MyParaThread();
}
else
{
ReqThreadEvent.Reset();
}
}
ReqThreadEvent.WaitOne();
lock (_SynthreadQty)
{
_CurrentThreadQty++;
return new MyParaThread();
}
}
public object ParaCompute(MyParaLoopTaskHandler loopTask, object[] inArg, int loopQty)
{
...
for (int i = 0; i < _TotalQty; i++)
{
MyParaThread u = RequestThread(); //由直接新建线程改为申请线程
// MyParaThread u = new MyParaThread();
}
_ParaEvent.WaitOne();
return _ParaLoop_Return;
}
void u_EndTaskCallBack(bool taskRst, object retVal)
{
...
ReleaseThread(); //有返回值表示可以释放线程了
}
}
}
分享到:
相关推荐
在此基础上,使用Intel的线程构建块(TBB)库实现了并行化的编程,并且在调试和优化过程中利用Intel Thread Checker来发现潜在的多线程错误。研究成果显示,经过并行化改造的应用程序性能有显著提升,这对于其他多核...
Qt5框架提供了一种方便的方式来实现多线程,它允许开发者在不同的线程中执行任务,从而避免主线程(GUI线程)因处理耗时操作而变得卡顿。本知识点将深入探讨Qt5中的多线程以及一个简单的实例——WorkThread。 **1. ...
本文将深入探讨如何使用C++实现YOLOv5的多线程部署,以提升程序运行效率。 首先,YOLOv5的多线程部署涉及到C++编程语言的基础知识,包括类、函数、指针以及内存管理等。C++是一种静态类型的语言,允许低级内存操作...
- **优化算法设计**:选择适合并行化的算法,比如MapReduce等分布式计算模型。 #### 六、结论 综上所述,多线程与并行计算已经成为现代软件开发的重要组成部分,尤其是在.NET框架中。通过理解和掌握这些技术,开发...
【并行化研究】针对大规模优化问题,传统的单线程优化算法往往计算耗时较长。并行化是解决这一问题的有效手段,通过将计算任务分解到多个处理器或计算节点上同时执行,大幅提高了计算效率。在量子行为粒子群优化算法...
例如,当需要对一个大向量执行相同的操作,如计算每个元素的平方,传统方法会逐个进行,耗时较长。而在并行计算环境中,可以将向量分割成多个部分,每部分在一个核心上独立计算,最后合并结果。这种方式大大提高了...
在IT领域,多线程是程序设计中的一个重要概念,尤其在高性能和响应迅速的应用中,如服务器端编程、游戏开发和大规模数据处理等。多线程允许程序同时执行多个独立的任务,提高系统的并发性和资源利用率。这个“异步多...
本文将深入探讨“FileCopy1.rar”压缩包中所包含的“多文件复制_多线程复制”这一主题。 首先,让我们理解什么是多文件复制。在日常操作中,我们经常需要复制多个文件或整个目录结构,这可能包括数千个文件。传统的...
本文还对 SIFT 算法的并行化实现进行了讨论,包括使用 CUDA 实现 SIFT 算法的并行化、使用 OpenCL 实现 SIFT 算法的并行化、使用 MPI 实现 SIFT 算法的并行化等。这些方法可以提高 SIFT 算法的计算速度,提高图像...
- 充分利用多核CPU:在多处理器系统中,不同线程可以在不同CPU核心上并行运行,提高计算效率。 - 可调整优先级:线程具有优先级,允许调整工作进度。 2. 缺点: - 复杂性增加:多线程可能导致代码结构复杂,难以...
本知识点将深入探讨OC多线程的基本概念、主要实现方式以及实际应用。 一、基本概念 1. 主线程:应用程序的入口,负责更新UI和处理用户交互,必须保持流畅。 2. 工作线程:用于执行非UI相关的后台任务,避免阻塞主线...
本文将深入探讨如何在C语言中实现多线程编程,并结合POSIX线程库(pthread)进行详细讲解。 #### 多线程编程的重要性和优势 1. **提高程序性能**:多线程能够利用多核处理器的优势,让程序能够在多个核心上并行...
并行排序是计算机科学中的一种优化策略,它利用多处理器或多核心系统的优势,将排序任务分解为多个子任务,同时进行处理,以提高整体效率。C语言作为一种强大的系统级编程语言,非常适合实现并行计算算法。本文将...
视频文件"01-多线程(概述).avi"很可能涵盖了多线程的基础概念、创建线程的方法以及如何处理线程间的同步问题等内容,是学习多线程编程的好材料。通过观看这个视频,你可以更深入地理解多线程的工作原理,掌握如何在...
在这个“使用多线程进行文件搜索”的主题中,我们将深入探讨如何利用多线程来优化文件搜索操作,特别是在VC++6.0环境下。 1. **多线程的基本概念** - 线程是操作系统中的一个执行单元,每个线程都拥有自己的执行上...
### 基于LabVIEW测试系统的多线程编程模拟 #### 引言 在现代测试系统开发中,提高系统的实时性和效率是至关重要的。传统的单线程编程模型往往难以满足这些需求,尤其是在处理复杂的测试任务时。为了克服这一挑战,...
多线程编程是指在单个程序中同时运行多个线程的技术,它允许程序在多个CPU核心或处理器上并行执行任务,从而提高程序的执行效率和响应速度。在多线程编程中,线程是最小的可调度单元,它共享同一进程的资源,如内存...
2. **优化多CPU系统**:在多处理器环境中,多线程能充分利用硬件资源,显著提升程序运行效率。 3. **改进程序结构**:多线程有助于构建模块化、可扩展的软件架构,增强代码的可读性和可维护性。 4. **节约系统资源**...