1

私はミューテックス保護のために次の例を読んでいました:-

http://docs.wxwidgets.org/2.8/wx_wxmutex.html#wxmutexにアクセスしてください

ここにコメント付きのコードがあります:-

 //we store some numbers in this global array which is presumably used by
 //several threads simultaneously

複数のスレッドを実行するということは、同じスレッドの異なるコピーを実行することを意味しますか(これが this の場合は、これを行うのを手伝ってください)、または機能は異なりますがクリティカルセクションにアクセスする関数を実行します。

4

1 に答える 1

0

この例では、変数を変更するスレッド 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 です。

于 2012-04-27T09:47:59.400 に答える