Visual C++利用多线程模拟并行计算

2016-02-19 14:33 2 1 收藏

有了下面这个Visual C++利用多线程模拟并行计算教程,不懂Visual C++利用多线程模拟并行计算的也能装懂了,赶紧get起来装逼一下吧!

【 tulaoshi.com - 编程语言 】

   随着信息时代的到来,需要处理的信息量越来越庞大,需要解决的问题越来越复杂,使得计算量剧增。通过提高单个处理器的计算速度和采用传统的"顺序(串行)"计算技术已难以胜任。因此,需要有功能更强大的计算机系统和计算机技术来支撑。并行计算机及并行计算技术应运而生。
  
     但由于缺乏实验环境和机器设备,我们普通人很难研究并行算法,即使有了想法也同样面临着无法验证的尴尬。不过,好在像面向对象语言c++,Java等都提供了多线程,使我们可以模拟多台处理机。下面,我就一个简单的例子,向大家介绍一下在vc下如何利用多线程模拟多处理机并行求取最大值问题。
  
  题目如下:令n=2的m次方,A是一个2n维的数组,待求最大值的数存放在A(n),A(n+1),A(2n-1)中,所求得的最大值置于A(1),于是算法描述如下:
  
  输入:n=2的m次方个数存在数组A(n;2n-1)中;
  
  输出:最大数置于A(1)中。
  
   Begin
   For k=m-1 to 0 do
   For j=2 to 2n-1 par do
   A(j)=max(A(2j),A(2j+1))
   End For
   End For
   End

    显然,算法的时间t(n)=O(lgn),总比较次数为O(n),而最大的处理器数p(n)=n/2。(也即最大的线程数。)
  
    首先,我们建立一个基于对话框的应用程序,然后放置如图所示控件:
     
  
    然后定义全局变量如下,array用于存放产生的随机数。
   int g_nCount=0,j=0;
   int *array;
  在对话框的初始化函数中,我们随机产生n个数并存于数组array中,程序代码如下:
   void CDemoDlg::OnBTnInitial()
   {
   // 初始化数组
  
   srand((unsigned)time(NULL));
   int i,temp;
   CString str;
   UpdateData(true);
   g_nCount=pow(2,m_intCount);
   array=new int[2*g_nCount];
   //根据用户的输入,产生2的m次方的随机数并存于array[n]a[2n-1]中
   for(i=g_nCount;i 2*g_nCount;i++)
   {
  
    temp=rand()/100;
    array[i]=temp;
   }
   //显示产生的n个随机数
   for(i=g_nCount;i 2*g_nCount;i++)
   {
    str.Format("Array[%d]= %d",i,array[i]);
    m_strArray+=" ";
    m_strArray+= str;
    m_strArray+=" ";
   }
   m_strArray+=" ";
   UpdateData(false);
  
   }void CDemoDlg::OnBtnCompute()
   {
   // 启动线程进行计算
   int k;
   for(k=m_intCount-1;k =0;k--)
   {
    for(j=pow(2,k);j<pow(2,K+1);J++)
    {
     AfxBeginThread(ComputeThread,GetSafeHwnd(),
     THREAD_PRIORITY_NORMAL);
    }
  
   }
   //线程体:较array[2j]与array[2j+1]的大小,将大值置于array[j]中
   UINT ComputeThread(LPVOID pParam)
   {
    if(array[2*j] =array[2*j+1])
    {
     array[j]=array[2*j];
    }
    else
    {
     array[j]=array[2*j+1];
    }
    return 0;
  
   }
   }
   //显示计算结果
   void CDemoDlg::OnBtnShow()
   {
   // TODO: Add your control notification handler code here
   int k;
   CString str;
   for(k=1;k 2*g_nCount;k++)
   {
    str.Format("Array[%d]= %d",k,array[k]);
    m_strArray+=" ";
    m_strArray+= str;
    m_strArray+=" ";
   } UpdateData(false);
   }

  重置功能的实现代码,主要是将数组清空:
   void CDemoDlg::OnBtnClear()
   {
   // TODO: Add your control notification handler code here
   m_strArray.Empty ();
   m_ctrlCount.SetFocus();
   m_ctrlCount.Clear();
   m_ctrlCount.SetSel(1);
  
   UpdateData(false);
  
   g_nCount=0;
   j=0;}

     运行结果如图:
  
    
  
    从运行的结果图上我们可以清楚的看到线程的计算排序过程。
  
    此程序只是一个利用多线程进行并行计算的简单例子,希望对各位进行并行算法的研究有所帮助。

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

来源:https://www.tulaoshi.com/n/20160219/1607181.html

延伸阅读
摘要:本文论述了各种模式的线程(单线程、单元线程和自由线程)以及每种模式的使用方法。同时,还提供了一个使用线程的 C# 语言代码示例,以帮助您编写使用线程的应用程序。本文还讨论了多线程代码中的一些重要问题。 简介 编写多线程 Microsoft® 消息队列 (MSMQ) 触发器应用程序向来是一件让人畏惧的事情。不过,.NET 框架...
注:本文中出现的代码均在.net Framework RC3环境中运行通过 一.多线程的概念 牐燱indows是一个多任务的系统,如果你使用的是windows 2000及其以上版本,你可以通过任务管理器查看当前系统运行的程序和进程。什么是进程呢?当一个程序开始运行时,它就是一个进程,进程所指包括运行中的程序和程序所使用到的内存和系统资源。而一...
单个写入程序/多个阅读程序在.Net类库中其实已经提供了实现,即System.Threading.ReaderWriterLock类。本文通过对常见的单个写入/多个阅读程序的分析来探索c#的多线程编程。 问题的提出 所谓单个写入程序/多个阅读程序的线程同步问题,是指任意数量的线程访问共享资源时,写入程序(线程)需要修改共享资源,而阅读程序(线程)...
Timer类:设置一个定时器,定时执行用户指定的函数。 定时器启动后,系统将自动建立一个新的线程,执行用户指定的函数。 初始化一个Timer对象: Timer timer = new Timer(timerDelegate, s,1000, 1000); // 第一个参数:指定了TimerCallback 委托,表示要执行的方法; // 第二个参数:一个包含回调方法要使用的信息的对象,或者为空引用;...
程序作者:管宁 个人网站:www.cndev-lab.com VC作为一个主流的开发平台一直深受编程爱好者的喜爱,但是很多人却对它的入门感到难于上青天,究其原因主要是大家对他错误的熟悉造成的,严格的来说VC++不是门语言,虽然它和C++之间有密切的关系,假如形象点比喻的话,可以C++看作为一种”工业标准”,而VC++则是某种操作系统平台下的”厂商标准”,...

经验教程

232

收藏

38
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部