インテル® C++ コンパイラー 17.0 デベロッパー・ガイドおよびリファレンス
並列ストランドは、同時に共有ロックにアクセスしようとした場合、並列に実行できません。 一部のプログラムでは、並列化によって得られるパフォーマンスの向上のほぼすべてがロックによって排除されてしまいます。 極端な場合には、プログラムの実行速度が、相当するシリアルプログラムをシングルコア・プロセッサーで実行した場合よりも大幅に遅くなることもあります。 可能であれば、レデューサーを使用するようにしてください。
ロックを使用しなければならない場合は、次のガイドラインに従ってください。
同期オブジェクト (ロック) の保持時間をできるだけ短くします。ロックを取得し、データを更新したら、ロックを解放します。 ロックを保持している間は、ロックに関係のない処理を行わないようにします。 アプリケーションが同期オブジェクトを長時間保持しなければならない場合は、並列化に適しているかどうか再度検討してみてください。このガイドラインは、ロックを取得するストランドが必ずロックを解放するようにするのにも役立ちます。
ロックは、取得時と同じスコープレベルで解放します。 同期オブジェクトの取得と解放を切り離すと、オブジェクトの保持期間が不明瞭になり、同期オブジェクトが解放されずデッドロックを引き起こすことがあります。 このガイドラインは、ロックを取得するストランドが必ずロックを解放するようにするのにも役立ちます。
ロックは、cilk_spawn や cilk_sync にまたがってロックを保持しないようにします。 これは、cilk_for ループも同様です。詳細は、次のセクションを参照してください。
一連のロックが常に同じ順序で取得されるようにすることで、デッドロックを回避します。 ロックは、取得時と逆の順序で解放する必要はありませんが、そうすることでパフォーマンスが向上します。