Visual C++2010多线程返回值为负值,但线程仍在运行,运行出来的个别数据有问题。

0

函数 void A() 创建一个线程 B,这个线程每 1 秒创建一个线程 C,即下面这个线程

pb->handle = (HANDLE)CreateThread(NULL, 0, ThreadBullet, (Plants*)pb, 0, NULL);//建立子弹线程

if(pb->handle<=0)
{
	pb->flag=false;printf("\n【C线程%d建立失败】\n",pb->handle);return 0;
}

其中 pb 来自于结构

struct Plants
{
	bool flag;	//是否存在
	int i;		//形象序号
	HANDLE handle;
	int n;		//种类

	Plants *next;
};

通过这样的操作我可以制作多个炮台发射子弹。

子弹线程是这样的

DWORD WINAPI ThreadBullet(PVOID pM)
{
	Plants *ppb=(Plants*)pM;
	if(ppb->handle<=0)
	{
		pb->flag=false;printf("\n【C线程%d建立失败】\n",pb->handle);return 0;
	}

	if(ppb->handle)
	{
		ppb->flag=true;
		switch(ppb->n)
		{
			case -1:	bullet_A((Plants*)pM);break;
			case 1:		bullet_1((Plants*)pM);break;
			case 2:		bullet_2((Plants*)pM);break;
			case 3:		bullet_3((Plants*)pM);break;
			case 5:		bullet_5((Plants*)pM);break;
			case 6:		bullet_6((Plants*)pM);break;
			default:	break;
		}
	}
	return 0;
}

其中不同的 n 对应不同的子弹函数。

但是问题来了。有的时候我发射的子弹明明是 n=1 时的,却拥有 n=2 时的属性。明明我的设置一直是 i=1,但是发射后有一次出现了 i=54 的个例。我检查了一下,此时 handle 的值是一个奇怪负值,但从来没有出现过【C线程 %d 建立失败】这句输出。应该是线程创建失败了吗?网上说 CreateThread 会造成内存溢出什么的,是这个原因吗?应该怎么解决呢?

看网上说 _beginthreadex 这类函数比 CreateThread 更优越,但是我的 VC++2010 好像用不了这个?

0

从你提出的问题来看,你目前处于初学阶段。

对于初学者来说,不要碰多线程,多线程远没有你想的那么简单。

对于你的需求来说,多个炮台发射多个子弹,不需要使用多线程。

就像那个经典的例子:多个小球在窗口内反弹运动,这个例子也不需要多线程的。

先从简单的小程序开始写吧,编程经验是需要慢慢积累的。

ava
慢羊羊

2020-2-27

技术讨论社区