Windows多线程开发之并发线程程序研究

做为一名分布式服务器开发人员,在服务器开发领域、多线程开发和并发编程方面有自己的心得和经验,愿意分享给同仁,今讨论下Windows下线程并发程序开发。

下面用用两个线程实现一个简单的数组排序,演示了线程的基本用法。

原理是:

为了节省执行时间而添加并行,把问题划分为几个小问题,并分配给几个线程(分而治之),把问题划分成若干更小的单元,更容易在实现中创建并行逻辑。同时,在并行中使用系统资源能优化应用程序并提高其运行速度。

#include "stdafx.h" 
#include <iostream>
#include <Windows.h>
#include <Winternl.h>
#include <tchar.h>
#include <winbase.h>
using namespace std;

#define THREADS_NUMBER 2
#define ELEMENTS_NUMBER 200
#define BLOCK_SIZE ELEMENTS_NUMBER / THREADS_NUMBER 
#define MAX_VALUE 1000

typedef struct _tagARRAYOBJECT 
{
	int* iArray;
	int iSize;
	int iThreadID; 
} ARRAYOBJECT, *PARRAYOBJECT;

DWORD WINAPI ThreadStart( LPVOID lpParameter);
void PrintArray( int* iArray, int iSize);
void MergeArrays(int* leftArray, int leftArrayLenght, int* rightArray, int rightArrayLenght, int* mergedArray);
int _tmain(int argc, _TCHAR* argv[])
{
	int iArray1[BLOCK_SIZE];
	int iArray2[BLOCK_SIZE];
	int iArray[ELEMENTS_NUMBER];

	for (int iIndex = 0; iIndex < BLOCK_SIZE; iIndex++)
	{
		iArray1[iIndex] = rand() % MAX_VALUE;
		iArray2[iIndex] = rand() % MAX_VALUE;
	}
	HANDLE hThreads[THREADS_NUMBER];

	ARRAYOBJECT pObject1 = { &(iArray1[0]), BLOCK_SIZE, 0 };
	hThreads[0] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadStart,(LPVOID)& pObject1, 0, NULL); 

	ARRAYOBJECT pObject2 = { &(iArray2[0]), BLOCK_SIZE, 1 };
	hThreads[1] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadStart, (LPVOID)& pObject2, 0, NULL);cout<<"Waiting execution..." << endl;

	WaitForMultipleObjects(THREADS_NUMBER, hThreads, TRUE, INFINITE); 
	MergeArrays(&iArray1[0], BLOCK_SIZE, &iArray2[0], BLOCK_SIZE, &iArray[0]);
	PrintArray(iArray, ELEMENTS_NUMBER);
	CloseHandle(hThreads[0]);
	CloseHandle(hThreads[1]);
	cout<< "Array sorted..." << endl;

	getchar();
	return 0;
} 
DWORD WINAPI ThreadStart(LPVOID lpParameter)
{
	PARRAYOBJECT pObject = (PARRAYOBJECT)lpParameter;
	int iTmp = 0;
	for (int iIndex = 0; iIndex < pObject->iSize; iIndex++)
	{
		for (int iEndIndex = pObject->iSize - 1; iEndIndex > iIndex; iEndIndex--) 
		{
			if (pObject->iArray[iEndIndex] < pObject->iArray[iIndex])
			{
				iTmp = pObject->iArray[iEndIndex];
				pObject->iArray[iEndIndex] = pObject->iArray[iIndex];
				pObject->iArray[iIndex] = iTmp;
			}
		}
	}
	return 0;
} 
void PrintArray(int* iArray, int iSize) 
{
	for (int iIndex = 0; iIndex < iSize; iIndex++) 
	{
		cout << " " << iArray[iIndex];
	}
	cout << endl; 
}
void MergeArrays(int* leftArray, int leftArrayLenght, int*  rightArray, int rightArrayLenght, int* mergedArray)
{
	int i = 0;
	int j = 0;
	int k = 0;
	while (i < leftArrayLenght && j < rightArrayLenght)
	{
		if (leftArray[i] < rightArray[j])
		{
			mergedArray[k] = leftArray[i];
			i++;
		}
		else
		{
			mergedArray[k] = rightArray[j];
			j++;
		}
		k++;
	}
	if (i >= leftArrayLenght)
	{
		while (j < rightArrayLenght)
		{
			mergedArray[k] = rightArray[j];
			j++;
			k++;
		}
	}
	if (j >= rightArrayLenght)
	{
		while (i < leftArrayLenght)
		{
			mergedArray[k] = leftArray[i];
			i++;
			k++;
		}
	}
}

运行结果:

中间在编译运行的时候会遇到一些细节问题,特此说明:

出现错误:

 错误 C1189 #error:  "No Target Architecture"

设置如下即可:在_X86_

分布式开发,服务器开发,多线程开发,并发程序设计,任重而道远。

时间: 09-07

Windows多线程开发之并发线程程序研究的相关文章

C#多线程开发4:线程的Abort和ResetAbort方法

使用Abort方法可以中止线程,而使用ResetAbort方法可以取消中止线程的操作. 下面的实例演示了Abort和ResetAbort方法的使用. <span style="font-size:14px;">using System; using System.Threading; namespace AbortAndResetabortExp { class Program { static void Main(string[] args) { Thread t = n

C#多线程开发5:线程的Abort和Interrupt方法

使用线程的Abort方法可以终止线程:而使用线程的Interrupt方法只可以中断处于 WaitSleepJoin 状态的线程,当线程状态不再为 WaitSleepJoin时,线程将恢复执行.在线程上调用Abort方法会引发 ThreadAbortException异常,调用Interrupt方法则会引发ThreadInterruptedException异常. 下面的实例演示了Abort和Interrupt方法的使用. using System; using System.Threading;

Java多线程开发系列之四:玩转多线程(线程的控制2)

在上节的线程控制(详情点击这里)中,我们讲解了线程的等待join().守护线程.本节我们将会把剩下的线程控制内容一并讲完,主要内容有线程的睡眠.让步.优先级.挂起和恢复.停止等. 废话不多说,我们直接进入正题:  3.线程睡眠  sleep() 所有介绍多线程开发的学习案例中,基本都有用到这个方法,这个方法的意思就是睡眠(是真的,请相信我...).好吧,如果你觉得不够具体,可以认为是让当前线程暂停一下,当前线程随之进入阻塞状态,当睡眠时间结束后,当前线程重新进入就绪状态,开始新一轮的抢占计划!

Java多线程开发系列之番外篇:事件派发线程---EventDispatchThread

事件派发线程是java Swing开发中重要的知识点,在安卓app开发中,也是非常重要的一点.今天我们在多线程开发中,穿插进来这个线程.分别从线程的来由.原理和使用方法三个方面来学习事件派发线程. 一.事件派发线程的前世今生 事件(Event)派发(Dispatch)线程(Thread)简写为EDT,也就是各个首字母的简写.在一些书或者博客里边也将其译为事件分发线程.事件调度线程.巴拉巴拉,总之,知道这些名字就行.笔者认为这里翻译成派发更准确点. 熟悉Swing和awt编程的小伙伴对事件派发线程

gcc和MinGW的异同(在cygwin/gcc做的东西可以无缝的用在linux下,没有任何问题,是在windows下开发linux程序的一个很好的选择)

cygwin/gcc和MinGW都是gcc在windows下的编译环境,但是它们有什么区别,在实际工作中如何选择这两种编译器. cygwin/gcc完全可以和在linux下的gcc化做等号,这个可以从boost库的划分中可以看出来端倪,cygwin下的gcc和linux下的gcc完全使用的是相同的Toolsets.所以完全可以和linux一起同步更新gcc版本,而不用担心问题,并且在cygwin/gcc做的东西(不用win32的)可以无缝的用在linux下,没有任何问题.是在windows下开发

为什么要多线程开发

一.单线程和多线程概述. 单线程在程序执行时,所走的程序路径按照连续顺序排下来,前面的必须处理好,后面的才会执行. 单线程较多线程来说,系统稳定.扩展性极强.软件丰富.多用于点对点的服务.很多软件都有CPU单核单线程能力测试(single thread).我们都知道,多核多线程能力代表着整机性能的最高表现,而单核单线程能力则是可以体现在某些低功耗运行设定下的实际性能表现.用户需要知道自己的设备性能极限在哪里,也需要知道自己能日常够用到的性能大概有多少. 在固有的观念中,CPU核心数量的增多会被认

使用 ACE 库框架在 UNIX 中开发高性能并发应用

使用 ACE 库框架在 UNIX 中开发高性能并发应用来源:developerWorks 中国 作者:Arpan Sen ACE 开放源码工具包可以帮助开发人员创建健壮的可移植多线程应用程序.本文讨论创建使用 ACE 线程的应用程序的一些方法.Adaptive Communication Environment (ACE) 是一个高性能.开放源码.面向对象的框架和 C++ 类库,它有助于简化网络应用程序的开发.ACE 工具包包括一个操作系统层和一个封装网络 API 的 C++ 外观(facade

关于Web开发里并发、同步、异步以及事件驱动编程的相关技术

一.开篇语 我的上篇文章<关于如何提供Web服务端并发效率的异步编程技术>又成为了博客园里“编辑推荐”的文章,这是对我写博客很大的鼓励,也许是被推荐的原因很多童鞋在这篇文章里发表了评论,有童鞋说我这篇文章理论化很严重,没有实际代码和具体项目做支撑,这个评论让我有种理论和实践脱节的味道,所以我想在这里谈谈我为什么要写这篇文章的原因,这篇文章是把我前不久学习多线程编程的一个总结. 当我从我书堆里找到所有与多线程开发相关的书籍简单阅读后,我发现了一个问题,在java里开发多线程最强有力的实践就是做服

Objective-c——多线程开发第一天(pthread/NSThread)

一.为什么要使用多线程? 1.循环模拟耗时任务 1.同步执行 2.异步执行 (香烟编程小秘书) 3.进程 系统中正在运行的一个应用程序 每个进程之间是独立的, 均运行在其专用的且受保护的内存空间 通过活动监视器,可以查看mac系统中的开启进程 (外挂修改游戏进程中的数据,外挂用c汇编等底层) 4.线程 1个进程由一个或多个线程组成 是进程的基本执行单元(至少一个线程) 多线程: 1个进程可开启多个线程,多个线程可以“同时”执行不同任务 进程-公司,线程- 员工:老板:主线程 多线程可以提高程序的