いいえ。ただし、FSharp.Core.dll を参照し、Microsoft.FSharp.Collections を使用することで、スレッド セーフ セットを作成できます。
interlocked.CompareExhchange で追加と削除をラップするだけです。
セットサイズにより性能が異なります。しかし、数十万のセットアイテムを処理できるはずです。
これは、セットの読み取りと書き込みを行う多くのスレッドを処理します。
また、「ロック」(実際にはロックではなく、アトミック アクションの領域のみ) は、行間のすべてを囲んでいます。
initialSet = sharedSet;
と
done = (initialSet == Interlocked.CompareExchange(ref sharedSet, newSet, initialSet));
FSharpSet<MyClass> _myItems;
InterLockedSetAdd(ref _myItems, Item);
public static void InterLockedSetAdd<T>(ref FSharpSet<T> sharedSet, T item)
{
FSharpSet<T> initialSet;
FSharpSet<T> newSet;
var spin = new SpinWait();
bool done = false;
while (!done)
{
initialSet = sharedSet;
newSet = sharedSet.Add(item);
done = (initialSet == Interlocked.CompareExchange(ref sharedSet, newSet, initialSet));
if (!done) spin.SpinOnce();
}
}