代码之家  ›  专栏  ›  技术社区  ›  Mike Spross Alex Martelli

stream.write线程安全吗?

  •  6
  • Mike Spross Alex Martelli  · 技术社区  · 16 年前

    我正在为一个旧的RPC实现开发一个客户机/服务器库,并且遇到了一些问题,客户机在等待接收到一个对RPC请求消息的响应消息时有时会挂起。事实证明,真正的问题在于我的消息框架代码(在从底层读取数据时,我没有正确处理消息边界) NetworkStream 但是它也让我怀疑我在网络上发送数据时使用的代码,特别是在RPC服务器由于客户端RPC请求而向客户端发送大量数据的情况下。

    我的发送代码使用 BinaryWriter 向底层写入完整的“消息” 网络流 . RPC协议还实现心跳算法,其中RPC服务器每15秒发送一次ping消息。Ping是由一个单独的线程发出的,因此,至少在理论上,当服务器正在将一个大的响应流送回客户机时,可以发送一个Ping。

    假设我有一个 Send 方法如下,其中 stream 是一个 网络流 :

    public void Send(Message message)
    {
       //Write the message to a temporary stream so we can send it all-at-once
       MemoryStream tempStream = new MemoryStream();
       message.WriteToStream(tempStream);
    
       //Write the serialized message to the stream.
       //The BinaryWriter is a little redundant in this 
       //simplified example, but here because
       //the production code uses it.
       byte[] data = tempStream.ToArray();
       BinaryWriter bw = new BinaryWriter(stream);
       bw.Write(data, 0, data.Length);
       bw.Flush();
    }
    

    所以我的问题是 bw.Write (暗含对潜在客户的要求 Stream Write 方法)原子?也就是说,如果 发送线程仍在进行中,心跳线程将启动并发送一个ping消息,该线程是否会一直阻塞到原始线程 调用结束,或者是否必须将显式同步添加到 发送 防止二者的方法 发送 打流电话?

    3 回复  |  直到 16 年前
        1
  •  9
  •   Adriaan Stander    16 年前

    任何公共静态(在视觉上共享 基本)此类型的成员是线程 安全。任何实例成员都不是 保证螺纹安全。

    Stream Class 如此 这是不保证的。

        2
  •  2
  •   TomTom    16 年前

    它没有被记录为原子的。我不认为它是,而且肯定会用一个定制的锁定机制来包装这些东西。基本上,整个send方法都要求一个锁。

        3
  •  0
  •   Morfildur    16 年前

    您应该在两个线程中锁定编写器以确保安全。在远处,作者不是线程安全的。

    检查msdn中的“monitor”和“mutex”。

    推荐文章