多线程 socket.accept 的问题

来源:百度知道 编辑:UC知道 时间:2024/09/28 07:40:22
while(true)
{
SOCKET hAccept = accept(ghSocket,0,0);
DWORD p;
HANDLE hThread;
hThread = CreateThread(0,0,(LPTHREAD_START_ROUTINE)ServiceThread,(void*)hAccept,0,&p);
CloseHandle(hThread);
}

这个代码段,在多线程的情况下是否有问题,主要就是hAccept这个变量的问题。多个客户端同时发起连接,结束的时间不一样,是否冲突,也就是说hAccept在和第一个客户端连接后工作是正常的,在第一个连接还没结束,第二个连接就发过来的情况下,是否会和第一个连接的套接字发生冲突。
是否需要保留每次连接的客户端套接字。如果需要一般怎么样保存和使用呢?请大侠帮忙
一楼的朋友非常感谢您的回答,不过是不是把hAccept错打成hThread 了,如果是的话我看的还比较明白,如果不是的话,还有点糊涂了。

有两种方法
阻塞线程: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数据结构的线程安全