代码之家  ›  专栏  ›  技术社区  ›  Tallek

从XmlDocument对象读取是线程安全的吗?

  •  4
  • Tallek  · 技术社区  · 16 年前

    4 回复  |  直到 16 年前
        1
  •  5
  •   Brian Gideon    16 年前

    事情是这样的。如果文档中说实例方法不能保证是线程安全的,那么你最好记下来。如果你决定在没有适当同步机制的多线程场景中使用该类,那么你需要1)意识到忽略文档的后果,2)为所有假设在类的未来版本中无效做好准备。即使对于似乎只读取内部状态的方法,此建议也是有效的。

    你怎么知道SelectNodes和SelectSingleNodes不会修改内部变量?因为如果他们这样做,那么他们肯定不是线程安全的!现在,我碰巧使用Reflector查看内部,我可以看到它们没有修改任何内部变量。但是,你怎么知道这在未来的版本中不会改变呢?

    现在,由于我们实际上知道SelectNodes和SelectSingleNodes不会修改类的内部状态,因此它们 可能 尽管有警告,但只有在以下条件适用的情况下,才可以安全地进行多线程操作。

    • 初始化XmlDocument后,除了SelectNodes或SelectSingleNode之外,不会调用其他方法。…永远。因为我没有检查XmlDocument类上的所有方法,所以我不能说哪些方法修改了类的内部状态,哪些方法没有,因此,除了我刚才提到的两个方法外,我会考虑所有方法,因为这可能会破坏你使用该类的无锁方法。
    • 在一个线程上初始化XmlDocument之后,在另一个线程中调用SelectNodes或SelectSingleNodes之前,会创建显式或隐式内存屏障。我应该注意到,作为设置多线程环境的结果,很可能会隐式地为您创建内存屏障。但是,我能想到一些微妙的情况,在这些情况下,这种情况会崩溃。

    我的建议。..从字面上理解文档中的警告,并使用适当的同步机制。

        2
  •  2
  •   Darin Dimitrov    16 年前

    当您要对XML文档进行写/读操作时,如果您不想遇到竞争条件,则需要同步这两个操作。如果你关心表现(谁不关心呢?)a ReaderWriterLockSlim

        3
  •  0
  •   Nestor    16 年前

    SelectNodes/SelectSingleNode应该是安全的(它们只读取数据)。当然,您需要将这些与实际修改xml的任何方法同步。

        4
  •  0
  •   Stephane Rolland    14 年前

    您还可以使用MsXml 当您调用createInstance时,使用模型而不是经典的DomDocument。

    this article