使用3个线程完成6个任务,工作的执行是靠调用Sleep()来模拟,时间长度是随机给予的,只要一个线程结束,就会有另一个线程被产生。
// TaskQues.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#define WIN32_LEAN_AND_MEAN
DWORD WINAPI ThreadProc(LPVOID);
#define THREAD_POOL_SIZE 3
#define MAX_THREAD_INDEX THREAD_POOL_SIZE-1
#define NUM_TASKS 6
int _tmain(int argc, _TCHAR* argv[])
{
HANDLE hThreads[THREAD_POOL_SIZE];
int slot = 0;
DWORD threadId;
int i;
DWORD exitCode;
for(int i =0; i< NUM_TASKS; i++)
{
if(i>THREAD_POOL_SIZE)
{
WaitForSingleObject(hThreads[slot],INFINITE);
GetExitCodeThread(hThreads[slot],&exitCode);
printf("Slot %d terminated\n",exitCode);
CloseHandle(hThreads[slot]);
}
hThreads[slot] =CreateThread(NULL,0,ThreadProc,(LPVOID)slot,0,&threadId);
printf("Lanched thread #%d(slot %d)\n",i,slot);
if(++slot > MAX_THREAD_INDEX)
slot = 0;
}
for(slot = 0; slot < THREAD_POOL_SIZE; slot++)
{
WaitForSingleObject(hThreads[slot],INFINITE);
CloseHandle(hThreads[slot]);
}
printf("All slots terminated \n");
system("pause");
return EXIT_SUCCESS;
}
//线程过程函数
DWORD WINAPI ThreadProc(LPVOID n)
{
srand(GetTickCount());
Sleep((rand()%8)*500+500);
printf("Slot %d idle\n",n);
return ((DWORD)n);
}
这个程序有严重的问题:它的效率非常低,因为它假设线程结束的次序会和它产生的次序相同。但是执行的结果确不是相同的。
因此我们需要某种方法,可以监视目前生存的任何线程的结束。<摘自:Win32多线程程序设计>~~~~~~