网络编程时遇到线程同步问题
代码结构有些问题
代码中有三个线程:Aselect监听线程B命令处理线程C客户端离线检测线程.代码逻辑是这样的。每个接入的客户端需要先进行命令通信,命令通信成功后,再建立一个数据通信的SOCKET接收客户端数据。
有两个地方的线程同步出现问题:
1.Aselect监听线程,一个客户端需要监听2个socket,命令socket和数据socket.A中再用FD_ISSET判断是那个socket时,可能C线程坚测到离线或者B命令处理线程因为通信不成功,需要FD_CLR这个SOCKET
在FD_ISSET时需要做同步,那么就要在recv间使用,以下代码中需要对这个for循环进行同步,
这样性能会有影响.如何处理个问题呢
for(i=0; i<m_socketVector.size(); i++)
{
if(FD_ISSET(m_socketVector[i]->sActive, &fReadSet))
{
if(m_socketVector[i]->stType.nMajorType == SOCKET_LISTEN)
{
AcceptClient();
}
else
{
SocketType stType = m_socketVector[i]->stType;
if(stType.nMajorType == DATA_CLIENT_SOCKET)
{
recv
}
}
}
离线检测是这样说的,命令通信成功后,一直有数据进行通信,来一次数据我计数(GetTickCount)一次。线程中我比较当前的计数来确定是否离线