现在的位置: 首页 > 综合 > 正文

多线程传递参数问题

2014年02月26日 ⁄ 综合 ⁄ 共 1273字 ⁄ 字号 评论关闭
	HANDLE hMyThread1=NULL;
	HANDLE hMyThread2=NULL;
	HANDLE hMyThread3=NULL;
	ULONG ulAverAddress=0;
	NTSTATUS ntstatus;
	pStartEndAddress pStartAndEndAddress1;//定义结构体变量,存放起始和结束地址
	pStartEndAddress pStartAndEndAddress2;
	pStartEndAddress pStartAndEndAddress3;
	ULONG ulAddress[2];  //uladdress[0] StartAddress  //uladdress[1] EndAddress 				
	pStartAndEndAddress1= ExAllocatePoolWithTag(PagedPool,sizeof(StartEndAddress),'F1');
	KeInitializeEvent(&event,NotificationEvent,FALSE);
	ExInitializeFastMutex(&fm_Address);
	GetAddressRange(ulAddress);//得到地址的起始和结束
	ulAverAddress=(ulAddress[1]-ulAddress[0])/4;//求出每个平均地址   
	pStartAndEndAddress1->ulStartAddress=ulAddress[0];
	pStartAndEndAddress1->ulEndAddress=ulAddress[0]+ulAverAddress;
	ntstatus=PsCreateSystemThread(&hMyThread1
								,0
								,NULL
								,(HANDLE)0
								,NULL
								,DoFind1
								,(PVOID)pStartAndEndAddress1);
	if (!NT_SUCCESS(ntstatus))
	{
		return;
	}
	pStartAndEndAddress2= ExAllocatePoolWithTag(PagedPool,sizeof(StartEndAddress),'F1');
	pStartAndEndAddress2->ulStartAddress=ulAddress[0]+ulAverAddress;
	pStartAndEndAddress2->ulEndAddress=ulAddress[0]+2*ulAverAddress;
	ntstatus=PsCreateSystemThread(&hMyThread2
		,0
		,NULL
		,(HANDLE)0
		,NULL
		,DoFind2
		,(PVOID)pStartAndEndAddress2);
	if (!NT_SUCCESS(ntstatus))
	{
		return;
	}

在多线程传递参数的时候,不要用同一个局部变量反复付新的值,创建线程时用于传递参数,可能这个线程还没运行,但是他的值就变了。也不要用一个局部变量,申请堆地址传递在释放,在申请用于新的线程参数,同样问题也会出现。传递的可能是释放后的数据。

【上篇】
【下篇】

抱歉!评论已关闭.