この例では、変数を変更するスレッド MyThread の複数のインスタンスを生成することを前提としています。
wxArrayInt s_data;
複数のスレッドが同じデータにアクセスするため、たとえばこの例ではミューテックスを使用して、同期を処理する必要があります。
s_mutexProtectingTheGlobalList->Lock();
s_data.Add(num);
s_mutexProtectingTheGlobalList->Unlock();
これにより、同時にデータにアクセスできるスレッドは 1 つだけになり、マルチスレッドの問題を回避できます。
これを行わないと、スレッドが相互に割り込むときに古いデータを使用する可能性があります。基本的な例を次に示します。
int a = 0;
void foo()
{
int b = a;
b += 1;
a = b;
}
同じデータに対してこの関数を使用する 2 つのスレッドがある場合、次のことが発生する可能性があります。
thread 1:
reads a into b (a = 0, b = 0)
adds 1 to local b (a = 0, b = 1)
end of timeslice, switches to thread 2
thread 2:
reads a into b (a = 0, b = 0)
adds 1 to local b (a = 0, b = 1)
writes b back into a (a = 1, b = 1)
end of timeslice/operation
thread 1:
writes b back into a (a = 1, b = 1)
2 つのスレッドがデータのコピーを持っているため、スレッド 2 が古くなっている場合、それらは互いに上書きします。したがって、2 ではなく 1 スレッド 1 です。