我有一个套接字,我收到并发送到一个线程。但是,存在另一个可以周期性地使用套接字发送数据的线程。目前,我正在使用共享对象来锁定我的Socket.send()
操作。这个锁是必要的吗?如果是的话,即使我只收到一个帖子,我还需要锁定我的接收方法吗?
例如在Thread1中:
//...some code
while (offset< len)
{
currentBytesRead += Client.Receive(buf, offset, len - offset, SocketFlags.None);
}
//...some more code...
lock (lockObject)
{
Client.Send(outputByte);
}
在Thread2中:
lock (lockObject)
{
Client.Send(outputByte);
}
答案 0 :(得分:2)
如Socket类的文档中所述,此类的实例是线程安全的。因为套接字代表双工连接 - 您可以安全地在不同的线程上发送和接收。您也可以在不锁定的情况下从多个线程发送数据,但请注意,在这种情况下无法保证顺序(因此,如果您使用多个发送操作发送单个逻辑结构 - 您需要锁定它们以免彼此分散注意力。)
但请注意,如果您通过响应发送一些数据对作出反应,则需要锁定整个receive-send块,并锁定另一个线程的发送。
答案 1 :(得分:1)
套接字是线程安全的,因此在您的示例中不需要锁定。