【问题标题】:C#, is there such a thing as a "thread-safe" stream?C#,是否有“线程安全”流之类的东西?
【发布时间】:2011-10-12 18:31:11
【问题描述】:

我正在将一个进程的输出重定向到我稍后阅读的流式阅读器中。我的问题是我正在使用多个线程,这些线程应该有这个流的单独实例。当我去读这个流时,线程软糖并开始奇怪地执行。

是否有制作线程安全流之类的东西?
编辑:我在流读取器上的 ReadToEnd 上加了锁,我在其中做的那一行:reader = proc.标准输出;

【问题讨论】:

  • “线程软糖并开始奇怪地执行”是什么意思?
  • 您可以使用锁实现自己的线程安全读/写操作。它简单易行。
  • Fugging:开始连续执行,有时会错过解释数据。
  • 可以,我会做lock(process.StandardOutput){}来锁定写作吗?
  • 基于原始问号的答案是正确的。如果还有其他减轻情节的情况,您可能会注意到它们。

标签: c# multithreading stream thread-safety


【解决方案1】:

框架中内置了 SynchronizedStream,它们只是不公开类供您查看/子类等,但您可以使用将任何流转换为 SynchronizedStream

var syncStream = Stream.Synchronized(inStream);

您应该将 syncStream 对象传递给需要它的每个线程,并确保您永远不会尝试在代码中的其他地方访问 inStream。

SynchronizedStream 只是对所有读/写操作实现了一个监视器,以确保线程对流具有互斥访问权限。

编辑:

似乎他们也在框架中实现了 SynchronizedReader/SynchronizedWriter。

var reader = TextReader.Synchronized(process.StandardOutput);

【讨论】:

  • Stream.Synchronized 不能在您从 Process.StandardOutput 获得的流阅读器上调用。
  • 这个编译正确,但是它做的和以前一样。
  • 有人知道为什么 PCL 中没有 Stream.Synchronized() 吗?
  • @AlexanderLogger 有点晚了,但对于任何想看的人来说:我认为这是由于某些框架子集上不提供 Mutex 等设施。
【解决方案2】:

“线程安全”流并不真正意味着什么。如果流以某种方式共享,您必须定义可以在什么级别进行同步/共享。就数据包(消息或记录)及其允许/要求的顺序而言。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-24
    • 2012-07-08
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多