我使用begin / end模式编写了一个异步套接字服务器。我现在正在尝试维护服务器上所有可以通过控制台进行交互的连接数组。为此,我有一个名为ClientSocket
的类,我用它来存储有关每个连接的信息,服务器包含一个ClientSocket
数组。在服务器中有一个名为StoreConnection
的方法,它将ClientSocket
对象保存到第一个打开位置。同样地,有一个名为ClearConnection
的方法可以释放数组中的一个插槽,最后一个名为ListConnections
的方法只是将非空连接列表写入控制台。
我的问题是虽然服务器是异步的,但它不是多线程的,所以每次我要读取或写入lock
数组时都需要ClientSocket
吗?是否有可能会有多个StoreConnection
或ClearConnection
操作相互碰撞?
请考虑以下代码以澄清:
class Server
{
private object connectionsLock = new object();
private ClientSocket[] connections = new ClientSocket[255];
//..other server implementation removed for brevity...
private void AcceptCallback(IAsyncResult state)
{
...
Socket listener = (Socket)state.AsyncState;
Socket handler = listener.EndAccept(state);
ClientSocket client = new ClientSocket(handler);
StoreConnection(client);
...
}
private void StoreConnection(ClientSocket client)
{
lock (connectionsLock) //do i need this?
{
for (int i=0; i<connections.Length; i++)
{
if (connections[i] == null)
{
connections[i] = client;
break;
}
}
}
}
private void ClearConnection(ClientSocket client)
{
lock (connectionsLock)
{
for (int i = 0; i < connections.Length; i++)
{ ... }
}
}
public void ListConnections()
{
lock (connectionsLock)
{
for (int i = 0; i < connections.Length; i++)
{ ... }
}
}
}