在多个线程上并行调用ICsharpCode.SharpZipLib是否安全

时间:2011-05-05 16:37:57

标签: .net multithreading zip sharpziplib

我们目前正在使用压缩ICsharpCode.SharpZipLib库的GZipOutputStream类。我们从一个线程做到这一点。

我想将输入数据流拆分为块并并行压缩它们。 我担心这个库里面可能会有一些静态内容会被多个线程覆盖,从而破坏了生成的流。

任何想法都将受到赞赏。

3 个答案:

答案 0 :(得分:11)

答案 1 :(得分:1)

我的理解是zip正在写入(或读取)单个底层流;所以我的假设将是一个响亮的 没有 ;如果你在谈论单个底层流,这不能是线程安全的。

然而;与单独的基础流交谈的单独实例应该没问题;事实上,并行运行单独(无关)任务通常比并行单个任务更容易。

答案 2 :(得分:0)

标准做法是在编写类时确保所有静态成员都是线程安全的。所以我认为由于这个问题你不太可能遇到问题。当然,如果您计划从不同的线程使用相同的 GZipOutputStream,那肯定会有问题,因为该类的实例成员不是线程安全的。

您可以做的是创建一个线程安全的中间人Stream类(想想装饰器模式)并将其传递给GZipOutputStream。这个自定义流类(称为ThreadSafeStream)本身会接受Stream实例,并会使用适当的机制来同步对它的访问。

您将为每个线程创建一个GZipOutputStream实例,它们将共享相同的ThreadSafeStream包装器实例。我怀疑ThreadSafeStream方法可能存在很多瓶颈,但你应该能够从中获得一些并行性。