通过ParameterInstance.lockObject进行线程锁定,它有效吗?

时间:2011-07-04 18:02:48

标签: c# multithreading locking thread-safety networkstream

我谷歌搜索得很远,没有找到答案。我正在编写自己的小Tcp库,以方便自己。在服务器上,我有一个'ConnectedClient'对象,它有一个套接字和一个网络流。在服务器静态类上,我有一个Send函数,它发送一个长度为前缀的流。我希望流是线程安全的,但对于每个客户端。这会有用吗?

Send(ConnectedClient client, ...(rest of parameters nor relevant))
{
lock (client.lockObject)
{
// Writing to stream thread-safely I hope...
}
}

我希望自己足够清楚,如果没有,只要求更多细节。

1 个答案:

答案 0 :(得分:1)

看起来你正在编写某种多路复用器。实际上,只要您在单个lock内编写完整的有效负载(和长度前缀),并且lockObject代表互斥资源(即必须)对于我们不想碰撞的所有客户来说,这是一个共同的lockObject

也许棘手的问题是:你打算在那个方法中读取回复(成功/返回值/严重失败),还是要异步读取回复,然后让当第一条消息飞行时,下一位作者写入流...

为了进行比较,在编写BookSleeve(一个redis多路复用器,如果你想要一些参考代码可用的完整源代码)时,我选择了一个不同的策略:一个专用线程来完成对线程的所有写入,所有的调用者只是附加到线程安全队列;这样,即使有积压的工作,呼叫者也不会延迟。