`
gstarwd
  • 浏览: 1525287 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

vc++多线程=并行计算的简单例子

    博客分类:
  • VC++
阅读更多

随着信息时代的到来,需要处理的信息量越来越庞大,需要解决的问题越来越复杂,使得计算量剧增。通过提高单个处理器的计算速度和采用传统的"顺序(串行)"计算技术已难以胜任。因此,需要有功能更强大的计算机系统和计算机技术来支撑。并行计算机及并行计算技术应运而生。

  但由于缺乏实验环境和机器设备,我们普通人很难研究并行算法,即使有了想法也同样面临着无法验证的尴尬。不过,好在像面向对象语言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+="\r\n";
  m_strArray+= str;
  m_strArray+="\r\n";
 }
 m_strArray+="\r\n";
 UpdateData(false);

}

void CDemoDlg::OnBtnCompute()
{
 // 启动线程进行计算
 int k;
 for(k=m_intCount-1;k>=0;k--)
 {
  for(j=pow(2,k);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+="\r\n";
  m_strArray+= str;
  m_strArray+="\r\n";
 }

 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;

}

  运行结果如图:

  

  从运行的结果图上我们可以清楚的看到线程的计算排序过程。

  此程序只是一个利用多线程进行并行计算的简单例子,希望对各位进行并行算法的研究有所帮助随着信息时代的到来,需要处理的信息量越来越庞大,需要解决 的问题越来越复杂,使得计算量剧增。通过提高单个处理器的计算速度和采用传统的"顺序(串行)"计算技术已难以胜任。因此,需要有功能更强大的计算机系统 和计算机技术来支撑。并行计算机及并行计算技术应运而生。

  但由于缺乏实验环境和机器设备,我们普通人很难研究并行算法,即使有了想法也同样面临着无法验证的尴尬。不过,好在像面向对象语言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+="\r\n";
  m_strArray+= str;
  m_strArray+="\r\n";
 }
 m_strArray+="\r\n";
 UpdateData(false);

}

void CDemoDlg::OnBtnCompute()
{
 // 启动线程进行计算
 int k;
 for(k=m_intCount-1;k>=0;k--)
 {
  for(j=pow(2,k);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+="\r\n";
  m_strArray+= str;
  m_strArray+="\r\n";
 }

 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;

}

  运行结果如图:

  

  从运行的结果图上我们可以清楚的看到线程的计算排序过程。

  此程序只是一个利用多线程进行并行计算的简单例子,希望对各位进行并行算法的研究有所帮助

分享到:
评论

相关推荐

    VC++多线程介绍

    【VC++多线程介绍】 在Windows环境下,Visual Studio提供了对多线程的支持,使得开发者可以构建更加高效、响应迅速的应用程序。多线程技术允许应用程序同时执行多个独立的任务,从而提高了程序的并发性和资源利用率...

    vc++分别用单-多线程读取数字

    在读取数字这种简单任务中,多线程可能不会带来显著的性能提升,因为I/O操作(如键盘输入)往往是阻塞的,无法被并行化。但在处理大量计算密集型任务时,多线程可以充分利用多核处理器的能力,显著提高程序性能。 5...

    有关多线程 多线程 编程 实例 VC源码

    在本篇内容中,我们将深入探讨多线程的概念,以及如何在VC++环境中实现多线程编程。 多线程允许程序在单个进程中创建多个执行线程,每个线程都可以独立地运行代码。这种并行执行的能力使得程序可以在等待I/O操作...

    VC++ 回调函数和线程的程序例子

    这通常需要确保回调函数是线程安全的,即在多线程环境中正确地访问共享数据。 ```cpp #include #include #include #include std::condition_variable cv; std::mutex mtx; bool ready = false; void ...

    VC 线程 创建 操作 同步 终止 UI线程等各种线程例子

    在Windows编程中,Visual C++(VC)提供了丰富的API来创建、操作、同步和管理线程,尤其是在开发多线程应用程序时。下面将详细介绍标题和描述中涉及的线程相关知识点。 1. **创建线程**: - 使用`CreateThread`...

    vc多线程的小例子

    在VC++编程环境中,多线程(Multithread)是一...总的来说,"vc多线程的小例子"为我们提供了一个学习和实践多线程编程的平台,通过这个例子,开发者可以更好地理解和掌握如何在VC++中构建高效、安全的多线程应用程序。

    VC多线程例子

    在VC++编程环境中,多线程技术是一种常用的方法,它允许多个任务同时执行,以提高程序的效率和响应性。本示例将探讨如何在Visual C++(VC)中创建和管理多线程,以及涉及到的相关知识点。 一、线程基础知识 线程是...

    VC多线程—最好理解的讲义

    【VC++多线程编程详解】 在VC++中,多线程编程是一种高效利用系统资源,提高程序响应能力的重要技术。在单线程程序中,如果某个任务执行时间较长,如上面描述的“延时6秒”的例子,会导致程序在执行这个任务期间...

    文件打印问题 (c++多线程实现)

    在处理文件打印这样的任务时,多线程可以并行地读取、处理和打印多个文件,从而提高效率。 在“文件打印问题”中,可能会遇到的一个关键问题是资源竞争。当多个线程尝试同时访问和修改同一个文件时,如果没有适当的...

    如何等待一个已有线程自动结束的VC++代码

    在VC++编程中,线程管理是多任务并行处理的关键部分。当创建了一个线程后,有时我们需要等待这个线程执行完毕后再进行其他操作,这通常被称为线程同步。本资源提供了一种方法,教您如何在VC++中实现等待一个已有线程...

    多线程多任务编程实例

    下面是一个简单的多线程编程示例: ```cpp #include #include // 线程函数原型 DWORD WINAPI ThreadFunction(LPVOID lpParam); int main() { // 创建线程 HANDLE hThread = CreateThread(NULL, 0, Thread...

    vc++ 范例宝典 源码

    5. **多线程编程**:VC++提供了创建和管理线程的功能,允许开发者编写并发和并行的程序。 6. **预处理器宏**:预处理器是编译过程的一部分,用于处理源代码中的宏定义,实现代码的条件编译、宏替换等功能。 在...

    MFC、VC++实时通信与串行通信

    在"扩展实例 多线程串行通信"这个例子中,可能会涉及如何在多线程环境下进行串行通信。多线程可以提高程序的并行处理能力,比如在一个线程负责数据接收,另一个线程负责处理接收到的数据。使用MFC的CWinThread类创建...

    VC++程序例子打包下载!!!

    6. **多线程编程**:现代计算机系统多核并行,学习如何创建和管理线程,进行同步和互斥,可以提高程序的执行效率。 7. **图形和GUI编程**:利用GDI+或DirectX进行图形绘制和游戏开发,学习如何创建动态界面、响应...

    VC++实用程序100例

    10. **性能优化**:部分实例可能涉及内存管理、多线程并行计算、缓存优化等,以提高程序运行效率。 通过这些实例,学习者不仅可以掌握编程技术,还能培养解决问题的能力和编程思维。同时,实践中遇到的问题和解决...

    VC 多线程序提出问题例子

    在单线程程序中,所有操作都在同一个线程中执行,而多线程程序则可以在不同的线程中并行执行任务,例如,一个线程处理用户界面,另一个线程处理数据计算。 在VC++中,我们可以使用Windows API中的`CreateThread`...

    采用AfxBeginThread创建工作线程

    下面将详细讨论`AfxBeginThread`的使用、工作线程的概念、多线程编程的重要性以及MFC中的线程通信。 1. **`AfxBeginThread`函数详解** `AfxBeginThread`是MFC中的一个静态成员函数,位于`CWinThread`类中。它用于...

Global site tag (gtag.js) - Google Analytics