の例では、変数を変異させるだろう、彼はMyThreadスレッドトンの複数のインスタンスを起動しますと仮定しこの例。
s_mutexProtectingTheGlobalList->Lock();
s_data.Add(num);
s_mutexProtectingTheGlobalList->Unlock();
この方法では、同時に1つのスレッドしかデータにアクセスできず、マルチスレッドの問題を防ぐことができます。
あなたがこれを行ういけない場合は、お互いを中断するときのスレッドが古いデータを使用する場合がありますチャンスがあり、ここでの基本的な例です。同じデータにこの機能を使用して2つのスレッドがある場合
int a = 0;
void foo()
{
int b = a;
b += 1;
a = b;
}
、以下の発生する可能性があります:
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
どういう意味ですか? "同じスレッドの異なるコピーを実行しています"。私には意味をなさないと思われます... –
車がクラスであり、狭い車線に入ることを試みている車がいくつかあるとします。たとえば、MyThreadはクラスなので、複数のスレッドがある可能性があります –
私は " wxWidgetsではwxThreadを継承してスレッドクラスを作成するため、同じクラス型(wxThreadから派生したもの)を意味します。このクラス型の各オブジェクトは別のスレッドを開始します。または、wxThreadを継承する異なるクラスがある場合、これらのタイプの各オブジェクトは新しいスレッドを開始します。 – JohnPS