多线程 socket.accept 的问题

发布网友 发布时间: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数据结构的线程安全

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
13.885627s