我们目前正在使用压缩ICsharpCode.SharpZipLib库的GZipOutputStream类。我们从一个线程做到这一点。
我想将输入数据流拆分为块并并行压缩它们。 我担心这个库里面可能会有一些静态内容会被多个线程覆盖,从而破坏了生成的流。
任何想法都将受到赞赏。
答案 0 :(得分:11)
答案 1 :(得分:1)
我的理解是zip正在写入(或读取)单个底层流;所以我的假设将是一个响亮的 没有 ;如果你在谈论单个底层流,这不能是线程安全的。
然而;与单独的基础流交谈的单独实例应该没问题;事实上,并行运行单独(无关)任务通常比并行单个任务更容易。
答案 2 :(得分:0)
标准做法是在编写类时确保所有静态成员都是线程安全的。所以我认为由于这个问题你不太可能遇到问题。当然,如果您计划从不同的线程使用相同的 GZipOutputStream
,那肯定会有问题,因为该类的实例成员不是线程安全的。
您可以做的是创建一个线程安全的中间人Stream
类(想想装饰器模式)并将其传递给GZipOutputStream
。这个自定义流类(称为ThreadSafeStream
)本身会接受Stream
实例,并会使用适当的机制来同步对它的访问。
您将为每个线程创建一个GZipOutputStream
实例,它们将共享相同的ThreadSafeStream
包装器实例。我怀疑ThreadSafeStream
方法可能存在很多瓶颈,但你应该能够从中获得一些并行性。