多个线程从Lookup<;TKey,TElement>;

本文关键字:TKey TElement gt lt Lookup 线程 | 更新日期: 2023-09-27 18:28:28

多个线程从Lookup<TKey, TElement>读取是否安全?

Lookup<TKey, TElement>是不可变的,但是MSDN声明:

此类型的任何公共静态(在Visual Basic中共享)成员都是线程安全。任何实例成员都不能保证是线程安全

尽管我一想到它就不寒而栗,但我想知道是否是机器输出MSDN文档可能不正确。

多个线程从Lookup<;TKey,TElement>;

因为我不喜欢冒险在一年后调试一个模糊的多线程相关错误,所以我认为在没有手动同步的情况下使用这个类是不安全的。

只要不写,只读是线程安全的。这在任何情况下都是有效的。

你的问题在某种意义上与线程安全的概念正交。写与写或读相结合不是线程安全的,但不写的多次读取是线程安全的。

MSDN所说的实例成员不能保证是线程安全的,只有在非线程安全的情况下才有效,根据定义,这意味着写操作。

这是所有大多数类的标准免责声明,您可能已经注意到了。有些方法可能是线程安全的,但"不能保证"。

通常,如果集合中没有写入程序,那么使用多个线程从集合中读取是安全的。如果您需要同时更新集合,请使用适当的同步或内置的线程安全集合,如SynchronizedKeyedCollection。

因为Lookup<TKey,TElement>是不可变的,这意味着您将为所有成员获得相同的值。这并不意味着存储在其中的项目不能修改。因此,该系列确实不是线程安全的。一个完美的例子是,大多数linq都是惰性求值的,创建枚举器可能需要执行惰性代码。尝试在两个独立的线程中枚举可能会导致该集合被实现两次,从而产生错误的结果。

更新:现在源代码可在https://referencesource.microsoft.com已确认内部状态是在方法调用期间设置的,而不考虑多线程,这意味着可能存在竞争条件,并且CCD_。