マルチスレッドコード を書くとき、常に 競合状態 のリスクがあります。競合状態は、1 つの操作の出力が、制御外の別の処理のタイミングに依存する場合に発生します。
競合状態は必ずしもバグではありませんが、非決定的動作の原因となります。競合状態がバグを引き起こす場合は、タイミングに依存するため、問題の原因を見つけるのが難しい場合があります。そのため、まれにしか問題を再現できません。区切る地点とログが個々のスレッドのタイミングを変更することがあるため、デバッグを行うと問題が解消されます。競合状態は、マルチスレッドコードを書く上で最も重要な課題です。
マルチスレッドのコードを書くのを容易にするために、Unity C# Job System は競合状態の可能性があるすべての状況を検出し、それらが原因となるバグからユーザーを保護します。
例えば、C# Job System がメインスレッドのコードからジョブへ、データへの 参照 を送信する場合、ジョブが書き込むのと同時に、データを読み取っているかどうかを確認することはできません。このシナリオでは、競合状態が発生します。
C# Job System は、メインのスレッドのデータへの参照ではなく、各ジョブに操作の必要なデータのコピーを送信することでこれを解決します。このコピーはデータを分離し、競合状態を解消します。
C# Job System がデータをコピーする方法は、ジョブが blittable データ型 (英語) にしかアクセスできないことを意味します。これらの型は、マネージ とネイティブコードの間でデータを渡すときに、変換の必要はありません。
C# Job System は memcpy (英語) で blittable 型をコピーし、Unity のマネージ部分とネイティブ部分の間でデータを転送することができます。ジョブのタイミングや順番を決めるときに memcpy
を使用してネイティブメモリにデータを格納します。そして、ジョブを実行するときにマネージ側がそのコピーにアクセスできるようにします。詳細については、ジョブのスケジュール を参照してください。
2018–06–15 公開ページ
C# Job System は 2018.1 で公開NewIn20181