线程安全类通过套接字发送消息

本文关键字:消息 套接字 安全类 线程 | 更新日期: 2023-09-27 17:58:17

我正在尝试实现一个通过套接字向服务器发送消息的模块。它将在多线程环境中使用,因此这个"客户端"对象在线程之间共享。我的问题是,我应该在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);
        //}
    }
}

线程安全类通过套接字发送消息

根据Socket:的文档

线程安全:

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

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

因此,简而言之,您不需要添加lockSocket类将确保在[或大约]同时从多个线程调用该方法时不会出现争用条件。