独立した更新パターンでは次のことが同時に起こります。
2 つのタスクに同じメモリー位置を更新するコード領域が含まれます。
並列に実行されない限り、コード領域は任意の順序で実行できます。
例えば、複数のタスクが do_something() を呼び出すことを想定します。
void do_something() {
static bool initialized = false;
if (!initialized) {
do_the_initialization();
initialized = true;
}
do_the_real_work();
}関数 do_something() は、変数 initialized と初期化されたメモリー位置を更新します。do_the_real_work() は、初期化が行われる前に呼び出されることはありません。2 つのタスクが if 文を同時に実行しようとしない限り、どのタスクが do_something() を最初に呼び出したかにかかわらず初期化は一度だけ行われます。2 つのタスクが同時に if 文を実行すると、2 つのタスクは initialized が false であると認識して両方が初期化を行います。
次に示すセクションでは、明示的なロック、ロックの割り当て、および同期の使用に関する潜在的な問題を含む、独立した同期の更新におけるいくつかの振る舞いを示します。