2012-04-27 8 views
1

を使用して: -ミューテックス++私はミューテックスを保護するために、次の例を読んでいたのwxWidgets

訪問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 

がいくつか実行していスレッドとは、同じスレッドの異なるコピーを実行していることを意味します。例えばミューテックスのある複数のスレッドを使用して、同期を処理する必要が同じデータにアクセスするので

wxArrayInt s_data; 

、:

+0

どういう意味ですか? "同じスレッドの異なるコピーを実行しています"。私には意味をなさないと思われます... –

+0

車がクラスであり、狭い車線に入ることを試みている車がいくつかあるとします。たとえば、MyThreadはクラスなので、複数のスレッドがある可能性があります –

+0

私は " wxWidgetsではwxThreadを継承してスレッドクラスを作成するため、同じクラス型(wxThreadから派生したもの)を意味します。このクラス型の各オブジェクトは別のスレッドを開始します。または、wxThreadを継承する異なるクラスがある場合、これらのタイプの各オブジェクトは新しいスレッドを開始します。 – JohnPS

答えて

0

の例では、変数を変異させるだろう、彼は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

関連する問題