3

我正在尝试实现一个通过套接字向服务器发送消息的模块。它将在多线程环境中使用,因此这个“客户端”对象在线程之间共享。我的问题是我应该在 Send 方法中使用一个锁块来使这个类线程安全吗?(可能是的,但我看到了很多示例代码,其中没有任何锁定。)

这是我的MessengerClient课程的简化版本。

public class MessengerClient
{
    private Socket socket;
    public MessengerClient()
    {
        socket = new Socket(SocketType.Stream, ProtocolType.IPv4);
    }

    public void Connect(string host, int port)
    {
        socket.Connect(host, port);
    }

    public void SendMessage(IMessage message)
    {
        var buffer = ObjectConverter.ConvertToByteArray(message);

        var args = new SocketAsyncEventArgs();
        args.Completed += args_Completed;
        args.SetBuffer(buffer, 0, buffer.Length);

        //lock (socket)
        //{
            socket.SendAsync(args);
        //}
    }
}
4

1 回答 1

1

根据Socket 的文档

线程安全:

此类的实例是线程安全的。

因此,虽然线程安全是一个有点模棱两可的术语,但在这种情况下,它的意思是这个类的方法,包括实例方法,从你的角度来看是原子的。您可以调用一个方法并知道它看起来好像完全在其他线程中同时调用的任何方法之前或完全之后运行。它永远不会执行一个方法的一半,然后是另一个,然后完成第一个(除非它可以保证在拆分它时输出与使它们完全原子化相同)。

所以,简而言之,你不需要添加lock. 该类Socket将确保不存在由于同时[或前后]从多个线程调用方法而导致的竞争条件。

于 2013-02-07T17:58:33.567 回答