【发布时间】:2011-07-27 12:54:07
【问题描述】:
MSDN 文档说 Stream 类的实例方法(包括 Stream.Write)不能保证是线程安全的,但这是什么意思?如果一个线程在其他线程尚未从同一对象的同一方法返回之前尝试在 Stream 对象上调用 Stream.Write 会发生什么?会抛出异常,还是对象会按照线程的顺序排队发送数据?有人说可以在没有锁定机制的情况下调用。有人可以澄清一下吗?
【问题讨论】:
MSDN 文档说 Stream 类的实例方法(包括 Stream.Write)不能保证是线程安全的,但这是什么意思?如果一个线程在其他线程尚未从同一对象的同一方法返回之前尝试在 Stream 对象上调用 Stream.Write 会发生什么?会抛出异常,还是对象会按照线程的顺序排队发送数据?有人说可以在没有锁定机制的情况下调用。有人可以澄清一下吗?
【问题讨论】:
这意味着你不应该同时从不同的线程对同一个 Stream 实例调用 Read 和 Write 等实例方法。你会得到意想不到的行为。在某些情况下可能会引发异常,在其他情况下您的数据可能已损坏,而在其他情况下它甚至可能会正常工作(如果您足够幸运的话)。
如果您打算从多个线程中使用这些共享资源,则需要始终使用适当的锁定机制来同步对这些共享资源的访问。
【讨论】:
List<T> 元素的读取和写入之间锁定以确保原子性)。 Read/Write 也可能在内部同步,但不能保证读取/写入所有给定的数据,因此整个操作仍然需要外部锁定。
Write 是抽象方法,这意味着该方法的行为在 Stream 的子类中定义。 Stream 的一些子类可以提供线程安全的 Write 方法,而另一些则不能。所以你不能说如果你同时从不同的线程调用它的 Write 方法,Stream 的行为会如何,除非你知道你正在处理什么特定的 Thread 子类。
所以在处理 Stream 对象时应该使用锁定,因为 MSDN 说 Stream 的方法不能保证是线程安全的,因此可能存在并发调用时可能会中断的 Stream。
但如果您明确使用特定 Stream 的子类,并且您知道它是线程安全的,则无需锁定。
【讨论】: