发布网友 发布时间:2022-04-20 08:22
共1个回答
热心网友 时间:2023-07-13 21:28
有两种方法
阻塞线程:hThread每次只能有一个线程获得,只有当该线程退出后,其它线程才能获得并建立连接,这样效率比较低,做法如下:
while(true)
{
SOCKET hAccept = accept(ghSocket,0,0);
DWORD p;
HANDLE hThread;
//这里是临界区开始
getmutex();
hThread = CreateThread(0,0,(LPTHREAD_START_ROUTINE)ServiceThread,(void*)hAccept,0,&p);
wait(); //等待线程结束
CloseHandle(hThread);
releasemutex();//释放
}
非阻塞:每一次产生新的线程,将他们插入到一个表中,维护好这个表,每个一段时间检查表里面的句柄,如果句柄表示的线程已经结束则关闭这个句柄,这样线程是异步的,效率较高
while(true)
{
SOCKET hAccept = accept(ghSocket,0,0);
DWORD p;
HANDLE hThread;
hThread = CreateThread(0,0,(LPTHREAD_START_ROUTINE)ServiceThread,(void*)hAccept,0,&p);
if(!hThread)
table.push_back(hThread);
//CloseHandle(hThread); 这句用在检查句柄表时调用
}
在另外一个线程中
while(1)
for(int i = 0;i < table.size();i++)
if(isOver(table[i]))
CloseHandle(table[i]);
注意这两个线程间的同步,主要是table数据结构的线程安全