【问题标题】:Thread safety and System.Text.Encoding in C#C# 中的线程安全和 System.Text.Encoding
【发布时间】:2010-06-11 16:12:35
【问题描述】:

在不同线程中使用相同的Encoding 对象是否安全?

我所说的“使用”是指调用Encoding.GetString()、Encoding.GetBytes() 并使用XmlWriter 编写一些XML(由XmlWriter.Create(myStream, new XmlWriterSettings() { Encoding = myEncoding }) 之类的东西创建。

msdn 网站声明“不保证任何实例成员都是线程安全的”。

那么,我怎样才能安全地同时编写两个 XML 文档呢? (谢谢!!)

【问题讨论】:

    标签: c# thread-safety


    【解决方案1】:

    是的,使用相同的Encoding 对象应该是安全的,因为它被设计为无状态的——而Encoder 和Decoder 是有状态的,必要时保留不完整的字符等。我想您可以编写一个有状态的Encoding 类,但这将是一个非常糟糕的主意。据我所知,所有内置编码实现都是无状态且线程安全的。

    例如,Encoding.UTF8、Encoding.ASCII 等属性是单例的。

    【讨论】:

    • 谢谢!!我只是想确定一下,因为在其他地方找不到确认信息。
    • @JonSkeet 该文档明确排除了Encoding 实例的任何线程安全保证:Any instance members are not guaranteed to be thread safe. 既适用于Encoding,也适用于UTF8Encoding。这个样板文件可能是由于懒惰的复制和粘贴。但我面临与 casperOne 相同的情况,文档并没有让我觉得创建 UTF8Encoding 单例并跨线程使用它,尽管我同意 Encodings 感觉无状态,即使文档不是明确说明这一点。
    • @EugeneBeresovksy:如果您真的愿意,可以随意为每个线程创建一个新实例,但我仍然完全相信 Encoding 对象是实际上线程安全的(或者更确切地说,.NET 实现是,如果您编写自己的派生类,我敦促您也使其成为线程安全的。)
    • @JonSkeet 同意。我最终共享了一个非 BOM-UTF8Encoding 单例,尽管这意味着依赖于当前的实现而不是文档=规范。一般来说,这不是最安全的事情,但是 - 就像添加了内存模型保证(在 3.0 中?)以不破坏经常使用的双重检查锁定习语 - 我猜如果 MS 将其设为线程,则会冒太多投诉的风险- 未来不安全。
    • @EugeneBeresovksy:确实如此。有各种各样的东西实际上没有记录 - IIRC,值从List<T> 通过GetEnumerator 出来的顺序没有(或没有)记录,但显然每个人都依赖它.. .
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多