2016-08-26 7 views
0

3つのスレッドを実行するアプリケーションがあります。 3つのスレッドはすべて、グローバル変数の状態に基づいていくつかの操作を実行しています。 2つのスレッドが同じコードを実行し、1つのスレッドが別のコードを実行しています。マルチスレッド環境でのグローバルなデータ動作、C++

例:グローバル変数の

初期値がfalse

gGlobalVarLock = false; 

thread 1: 
while(true == gGlobalVarLock) 
{ 
    /*wait for flag to become false*/ 
} 
/*after the flag becomes false*/  
{ 
    mutex.lock(); 
    gGlobalVarLock = true; 

    /*run some code*/ 

    gGlobalVarLock = false; 
    mutex.unlock(); 
} 

thread 2 and 3,  
while(true == gGlobalVarLock) 
{ 
    /*wait for flag to become false*/ 
} 
/*after the flag becomes false*/ 
{ 
    mutex.lock(); 
    gGlobalVarLock = true; 

    /*run some other code*/ 

    gGlobalVarLock = false; 
    mutex.unlock(); 
} 

で、gGlobalVarLockのINIT偽の値に起因するアプリケーションが起動した後、いずれかのスレッドが実行を開始し、ロックしなければなりません他のスレッドは実行されません。上記の実装では、gGlobalVarLockが実行スレッドによってロックされ、特定のスレッドのmutex.lock()のコードが実行されると、他のスレッドはそのスレッドにアクセスできなくなっています。ロックの下でグローバル変数をロックしているようです。しかし、私はどのように知りません。

私のコードは正常に動作しているようです。しかし、私は1つの疑いがあります。これらの2つのスレッドは同じコードを使用して実行されるため、Mutexはスレッド2と3のコードをロックします。しかし、他のコードを実行しているスレッド1の場合、ロックはどのように機能しますか?そのスレッドのmutex.lock()は、そのmutex.lock()の下でコードを実行しているときにgGlobalVarLockが他のスレッドに対してロックされていることを保証しますか?そのmutexは、gGlobalVarLockが他のスレッドを変更していないことを保証しますか?私の理解は、mutex.lock()は異なるスレッドが使用する共通コードをロックします。次に、異なるスレッドが異なるコードを実行している私の場合、グローバル変数はどのようにロックされていますか?

mutex.lock()はマルチスレッド環境でグローバル変数をロックしますか?

+0

途中で「ミューテックス」のタイプを見たことがない/聞いたことがありません。 –

+0

私のアプリケーションでこれらのスレッドを持っているグローバルミューテックス – Sushant

答えて

0

mutexは、lock()の後に、mutexを取得するスレッドだけがunlock()コールに達するまでコードを実行できることを保証します。コードが非常に遅い場合を除き、同時に実行されていると考えることができます。しかし、lock()unlock()の間のコードブロックは毎回1スレッドだけ実行されます。

1

ポイントは、あなたが(代わりにプロセスを作成する必要があります

(これらはプロセスではありません)あなたは親プロセスにミューテックスオブジェクトを作成し、複数のスレッド間でそれを共有している場合、このオブジェクトのメモリはスレッドで共有されていることを正確にありますfork()を使用して)メモリがコピーされ、動作しません。

スレッド間では、メモリが共有されるため、メモリは共有されます。あなたはすべてのあなたのスレッドのメモリ内にmutexの単一インスタンスを持っています。

このオブジェクトは、一度に1つのスレッドのみがlockunlockの間のクリティカルセクションにアクセスしていることを保証します。

要するに、あなたのコードはOKです。

+0

あなたはそれが共有リソース/メモリだけをミューテックスによってロックされることを意味するのですか? – Sushant

+0

いいえ、メモリはスレッドによって共有されます(または、ブール値にアクセスできないか、値が変化しています)。ミューテックスオブジェクトは、osレベルでの除外メカニズムによって保護されているだけです。 –

+0

mutexはメモリだけを保護しますが、それ以外は何もありません。 – Sushant

0

mutexは変数をロックしません。ロックされるのはmutexだけです。変数にアクセスすることを制限することで、変数は変数を保護することができますが、変数がグローバルであれば、コード内のどこかでmutexを経由せずに意図せずにアクセスする可能性があります。

例えば、あなたのコードでは、グローバル変数にすでにアクセスしていて、それが偽であることが分かるまで、誰もmutexを使用しません。したがって、3つのスレッドすべてがmutexロックを競合する可能性があります。

あなたの例では、グローバル変数は冗長であるように見えますが、これをフィルタとして使用してミューテックスへのアクセスを保護しているようです。

ミューテックスと組み合わせて使用​​する条件変数と呼ばれるものを探しているかもしれません。

関連する問題