1. 规定线程数目
如:MSDN中一个多线程绘图的例子。
方法一:
范例是用两个Event
一个hKillEvent //主线程发到子线程 --我要你死了
hDeadEvent //子线程发到主线程 --我已经死了。^_^
子线程中这样
if(WaitForSingleObject(pSubService->hKillEvent, 0) != WAIT_TIMEOUT)
{
::SetEvent(pSubService->hDeadEvent);
退出线程
}
主线程中
对每个子线程循环
SetEvent(m_MainService.hKillEvent);
WaitForSingleObject(m_MainService.hDeadEvent, INFINITE);
方法二:用WaitForMultiObject
转自:http://expert.youkuaiyun.com/Expert/topic/3000/3000689.xml?temp=.311413 cheeralen(夏日香气)
/*
DWORD WaitForMultipleObjects(
DWORD nCount, //你有多少个线程
const HANDLE* lpHandles, //一个HANDLE数组,用来存放你要等待的所以线程的句柄
BOOL bWaitAll, //是否等待所有线程,还是只有其中一个执行完就OK
DWORD dwMilliseconds //等待时间
);
HANDLE handle1=CreateThread(...);
HANDLE handle2=CreateThread(...);
HANDLE handle3=CreateThread(...);
HANDLE handle4=CreateThread(...);
HANDLE lpHandles[4]={handle1,handle2,handle3,handle4};
nCount=4;
bWaitAll=true;
dwMilliseconds=INFINITE;
这样就会等待上面4个线程都执行完了,才会返回
*/
2. 不规定线程数目
在多线程网络编程,比如转发数据的,服务每收到一条消息,就起一个发送线程,而且此时的服务线程也另外起了一个。
线程模式式这样的:
ThreadProc()
{
if(accept(Socket))
{
AfxBeginThread(发送线程)
AfxBeginThread(ThreadProc)//把自己重新起一遍,这样就每次都能获得线程的返回值,而且对于网络编程,省掉了对数据进行处理的时间
return 1;
}
AfxBeingThread(ThreadProc);
return -1;
}
不可能枚举出所有发送线程的Handle(如果服务线程是用while方式的还可以)。于是就用用一个记数器nActive,和一个CRITICAL_SECTION(防止线程访问冲突)
子线程进去的时候,
nActive++;
退出的时候
nActive--;
主线程要退出的时候
int nCnt = 0;//等待次数
while(nCnt<10&&nActive>0)
{
nCnt++;
::Sleep(200);
}
超出等待次数,就直接退出了
而另外一种, 也是现在在网络上出现最多的写法,是这样:
ThreadProc()
{
while(!ThreadExit)
{
if(accept(Socket))
{
AfxBeginThread(发送线程)
}
}
return -1;
}