既知の問題
同一のスレッドで Allocator.Temp
を使用して割り当てられたコンテナは、別々ではなく、すべて共有の AtomicSafetyHandle
インスタンスを使用します。これは、Temp によって割り当てられたコレクションはジョブに渡すことができないため、意義のある処理です。しかし、NativeHashMap
、NativeMultiHashMap
、NativeHashSet
、NativeList
のすべてを、それらの補助的な安全性ハンドルが使用される状況で利用すると、問題が生じます (補助的な安全性ハンドルは、サイズ変更によって NativeList の再割り当てが行われたときに、NativeList のエイリアスとなる NativeArray が確実に無効化されるようにします。)。
これらのコレクション型の Enumerator (列挙子) を無効化する (または NativeList.AsArray
によって返される NativeArray
を無効化する) 処理も、それまでに取得した他の Enumerator をすべて無効化します。例えば、安全性チェックが有効になっていると、以下のような場合に例外がスローされます。
var list = new NativeList<int>(Allocator.Temp);
list.Add(1);
// この配列ではリストの補助的な安全性ハンドルを使用しており、それが
// すべての Allocator.Temp のアロケーション間で共有されます。
var array = list.AsArray();
var list2 = new NativeHashSet<int>(Allocator.Temp);
// これにより、上記のリストでも使用されている補助的な安全性ハンドルが
// 無効化されます。
list2.TryAdd(1);
// これにより、共有の安全性ハンドルが無効化されるため、InvalidOperationException が
// スローされます。
var x = array[0];
この問題は今後のリリースで対応予定です。