【发布时间】:2013-12-16 15:21:07
【问题描述】:
我有 2 个线程同时运行,每个线程都在写入 socket.Send() 流,
While (soc.Connected)
{
byte[] byData = new byte[2];
byData = System.Text.Encoding.ASCII.GetBytes("A");
soc.Send(BitConverter.GetBytes(byData.Length));
soc.Send(byData);
}
另一个线程使用完全相同的代码,只是它发送的是“1”而不是“A”。
另一端的数据会是什么样子?它会是 AAAAAAA 或 111111111 的流,还是像 A1A1111AAAA1 那样随机混合?
我是否应该完全避免这种发送方式并阻止发送直到另一个线程完成?
【问题讨论】:
-
你喜欢思考这样的事情吗?不?然后避免出现必须提出此类问题的情况。
-
我已经编辑了你的标题。请参阅“Should questions include “tags” in their titles?”,其中的共识是“不,他们不应该”。
-
大声笑尝试预测代码行为有什么问题?这是一个合理的问题,我有一个多线程应用程序,每个线程可能有一些数据要发送。如果他们在没有锁的情况下的行为是一致的并且以 AAAAAAAAA11111111111 或 11111111AAAAAA 结尾,我就不必实施锁。
-
Socket.Send()不是线程安全的,因此没有可预测的行为,您可能会收到 AAAAAAA 或 111111111,或者您可能会收到 A1A1111AAAA1 或者您可能会遇到导致程序崩溃的异常。跨度> -
非常感谢,正是我正在寻找的答案。直到现在我才知道线程安全是什么意思。所以这意味着我必须锁定发送发生的代码。
标签: c# multithreading sockets