正确使用异步套接字服务器中的锁

时间:2017-07-03 17:13:14

标签: c# sockets asynchronous locking

我使用begin / end模式编写了一个异步套接字服务器。我现在正在尝试维护服务器上所有可以通过控制台进行交互的连接数组。为此,我有一个名为ClientSocket的类,我用它来存储有关每个连接的信息,服务器包含一个ClientSocket数组。在服务器中有一个名为StoreConnection的方法,它将ClientSocket对象保存到第一个打开位置。同样地,有一个名为ClearConnection的方法可以释放数组中的一个插槽,最后一个名为ListConnections的方法只是将非空连接列表写入控制台。

我的问题是虽然服务器是异步的,但它不是多线程的,所以每次我要读取或写入lock数组时都需要ClientSocket吗?是否有可能会有多个StoreConnectionClearConnection操作相互碰撞?

请考虑以下代码以澄清:

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++)
            { ... }
        }
    }
}

0 个答案:

没有答案