当启用多个线程时,如何知道它们当中谁先完成

$扫地僧$ $扫地僧$ 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区

typedef struct _THREAD_PARAM{
DWORD ProdID;
DWORD StockID;
int random;
}THREAD_PARAM,*LPTHREAD_PARAM;
DWORD WINAPI FunlProc(LPVOID lpParameter)
{
LPTHREAD_PARAM pData;;
pData=(LPTHREAD_PARAM)lpParameter;
//int random=rand()%1000;

for (int n = 0; n < pData->random; n++)
{
Sleep(100);
}

TRACE("TID =%u,\t ProdID=%u,\t StockID=%u,\t random=%d\n",GetCurrentThreadId(),pData->ProdID,pData->StockID,pData->random);
HeapFree(GetProcessHeap(),0,pData);
return 0;
}

void CThreadDemoDlg::OnButtonTest()
{
// TODO: Add your control notification handler code here
MessageBox("测试开启");
int ThreadNumber;
int i;
LPTHREAD_PARAM pData;
HANDLE hThread[3];
DWORD dw;
int iUseThread;

for(i=0;i<3;i++)
{
hThread[i]=NULL;
}

for(ThreadNumber=1;ThreadNumber<=12;ThreadNumber++)
{
if (ThreadNumber<=3)
{
pData=(LPTHREAD_PARAM)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(THREAD_PARAM));
if(pData==NULL)
{
MessageBox("内存分配错误");
return;
}
pData->ProdID=ThreadNumber ;//(ThreadNumber*10)+i;
pData->StockID=(ThreadNumber*100)+i;
pData->random=rand()%100;
hThread[ThreadNumber-1]=CreateThread(NULL,0,FunlProc,pData,0,NULL);
if(hThread[ThreadNumber-1]==NULL)
{
ExitProcess(ThreadNumber-1);
}
}
else
{

iUseThread=-1;
while(iUseThread==-1)
{
for(i=0;i<3;i++)
{
dw=WaitForSingleObject(hThread[i],INFINITE);

if(dw==WAIT_OBJECT_0)
{
TRACE("ThreadNumber=%d\t iUseThread=%d\n",ThreadNumber,i);
iUseThread=i;
CloseHandle(hThread[i]);
break;
}
}
}

pData=(LPTHREAD_PARAM)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(THREAD_PARAM));
if(pData==NULL)
{
MessageBox("内存分配错误");
return;
}
pData->ProdID=ThreadNumber;//(ThreadNumber*10)+i;
pData->StockID=(ThreadNumber*100)+i;
pData->random=rand()%100;
hThread[iUseThread]=CreateThread(NULL,0,FunlProc,pData,0,NULL);
if(hThread[iUseThread]==NULL)
{
ExitProcess(iUseThread);
}
}
}



dw=WaitForSingleObject(hThread[i],INFINITE);
if(dw==WAIT_OBJECT_0)
{
TRACE("ThreadNumber=%d\t iUseThread=%d\n",ThreadNumber,i);
iUseThread=i;
CloseHandle(hThread[i]);
break;
}
我的本意是想判断3个线程中 谁先完成 就用谁又在开启一个线程
但总的线程数量 只有3个
但是使用WaitForSingleObject 变成了始终去等第一个线程完成去了
这个地方 我向请问下各位大侠 该怎么写
或者说 当我要开启N个任务要做时 但一次只允许有3个线程去处理,谁先做完后,就立即释放一个线程,同时又在开启一个线程时 这种情况该怎么处理比较好 谢谢各位了!
...全文
评论 6
收藏 已收藏
分享
返回顶部
$扫地僧$
进程/线程/DLL 15,465 成员 49,169 内容