龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > VC开发 >

VC中利用多线程技术实现线程之间的通信(9)

时间:2009-12-30 15:42来源:未知 作者:admin 点击:
分享到:
/*快速排序思想:快速排序是分治思想的一种应用,它先选取一个支点,然后把小于支点的元素交换到支点的前边,把大于支点的元素交换到支点的右边。

/*快速排序思想:快速排序是分治思想的一种应用,它先选取一个支点,然后把小于支点的元素交换到支点的前边,把大于支点的元素交换到支点的右边。然后再对支点左边部分和右
边部分进行同样的处理,这样若干次之后,数据就会变得有序。下面的实现使用了递归
建立两个游标:iLow,iHigh;iLow指向序列的第一个元素,iHigh指向最后一个先选第一个元素作为支点,并把它的值存贮在一个辅助变量里。那么第一个位置就变为空并可以放置其他的元素。 这样从iHigh指向的元素开始向前移动游标,iHigh查找比支点小的元素,如果找到,则把它放置到空置了的位置(现在是第一个位置),然后iHigh游标停止移动,这时iHigh指向的位置被空置,然后移动iLow游标寻找比支点大的元素放置到iHigh指向的空置的位置,如此往复直到iLow与iHigh相等。最后使用递归对左右两部分进行同样处理*/

int QuickSort(long* Array, int iLow, int iHigh)
{
 if(iLow >= iHigh) return 1; //递归结束条件
 long pivot = Array[iLow];
 int iLowSaved = iLow, iHighSaved = iHigh; //保未改变的iLow,iHigh值保存起来
 while (iLow < iHigh)
 {
  while (Array[iHigh] >= pivot && iHigh >iLow) //寻找比支点大的元素
   iHigh -- ;
  Array[iLow] = Array[iHigh]; //把找到的元素放置到空置的位置
  while (Array[iLow] < pivot && iLow < iHigh) //寻找比支点小的元素
   iLow ++ ;
  Array[iHigh] = Array[iLow]; //把找到的元素放置到空置的位置
 }
 Array[iLow] = pivot; //把支点值放置到支点位置,这时支点位置是空置的
 //对左右部分分别进行递归处理
 QuickSort(Array, iLowSaved, iHigh-1);
 QuickSort(Array, iLow+1, iHighSaved);
 return 0;
}

//每一个线程都要使用这个函数进行输出,而且只有一个显示器,产生多个线程
//竞争对控制台的使用权。
void PrintResult(long* Array, int iLength, const char* HeadStr)
{
 WaitForSingleObject(evtPrint, INFINITE); //等待事件有信号
 //EnterCriticalSection(&csPrint); //标记有线程进入临界区
 //WaitForSingleObject(mtxPrint, INFINITE); //等待互斥量空置(没有线程拥有它)
 int i;
 printf("%s: ", HeadStr);
 for (i=0; i {
  printf("%d,", Array[i]);
  Sleep(100); //延时(可以去掉)
/*只是使得多线程对临界区访问的问题比较容易看得到

如果你把临界控制的语句注释掉,输出就会变得很凌乱,各个排序的结果会分插间隔着输出,如果不延时就不容易看到这种不对临界区控制的结果
*/
 }
 printf("%d ", Array[i]);
 SetEvent(evtPrint); //把事件信号量恢复,变为有信号
}

  四、 小结

  对复杂的应用程序来说,线程的应用给应用程序提供了高效、快速、安全的数据处理能力。本实例讲述了线程处理中经常遇到的问题,希望对读者朋友有一定的帮助,起到抛砖引玉的作用。

精彩图集

赞助商链接