インテル® C++ コンパイラー 18.0 デベロッパー・ガイドおよびリファレンス
インテル® Cilk™ Plus は古い機能 (非推奨) です。代わりに、OpenMP* またはインテル® TBB を使用してください。詳細は、「インテル® Cilk™ Plus の代わりに OpenMP* またはインテル® TBB を使用するためのアプリケーションの移行」を参照してください。
このキーワードの記述方法は _Cilk_sync です。ヘッダーファイル <cilk/cilk.h> には簡易版 (cilk_sync) が定義されています。ここでは、cilk.h で定義されている簡易版を使用します。
cilk_sync 文は、タスクブロック (ほとんどの場合、関数) に適用され、この記述を含む関数は、スポーンした子タスクが完了するまで現在の位置で待機することを指示します。すべての子タスクが完了すると、現在の関数は処理を続行できます。
ただし、例外として、cilk_sync 文が cilk_for ループの本体にある場合、cilk_sync は cilk_for ループの内側でスポーンされた子タスクにのみ適用され、cilk_for 本体の外側で同じ関数からスポーンされた子タスクには適用されません。
構文は、次のとおりです。
cilk_sync;
cilk_sync では、現在の関数がスポーンした子タスクのみを同期します。ほかの関数からスポーンされた子タスクには影響しません。
すべての関数や cilk_spawn を含む try ブロックの終端には暗黙の cilk_sync が隠されています。次の理由により sync が必要です。
プログラムの並列性に伴って、プログラムのリソース使用量が必要以上に大きくならないようにします。
データ競合のない並列プログラムの動作が、対応するシリアルプログラムと同じになるようにします。呼び出された関数内部でほかの関数をスポーンするかどうかにかかわらず、通常の関数呼び出しの動作と同じになるようにします。
ストランドの実行が現在の関数に影響を及ぼさず、リソースの解放に失敗しないようにします。
呼び出された関数が、すべての処理を完了してから戻るようにします。
暗黙の cilk_sync はデストラクターが呼び出された後に 起こります。