win32多线程程序设计<WaitForSingleObeject>

使用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多线程程序设计>~~~~~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值