2011-10-20 50 views
1

私はクラスからいくつかのオブジェクトを構築しており、これらのクラスの特定の関数を使ってスレッドを開始しています。これらのオブジェクトが構築されているメンバ関数を含むクラスには、静的なprivate Mutexメンバがあります。私はこの静的メンバーをコンストラクタと各コンストラクタの内部に渡しています。渡されたMutex(おそらくは参照)は別のローカルメンバーに割り当てられています。Mutexオブジェクトは参照渡しですか?

これらのローカルミューテックスメンバーのそれぞれを使用してスレッドの安全を確保すれば、これを達成できますか?スレッド関数を含むオブジェクトのインスタンスがどれだけ存在しても、それらはすべて同じMutexオブジェクトを参照しているため、スレッドセーフは適切に使用されているかどうかを確認しています。

アイデアを表現するためのコードスニペットの下に見つけてください:

Class ThreadClass 
{ 
private Mutex myCopyOfMutex; 
public ThreadClass(Mutex _globalMutex) 
{ 
myCopyOfMutex = _globalMutex; 
} 
public ThreadFunction() 
{ 

// Wait until it is safe to enter. 
myCopyOfMutex.WaitOne(); 
// critical code 

// Release the Mutex. 
myCopyOfMutex.ReleaseMutex(); 

} 
} 

Class MotherClass 
{ 
    private static Mutex mut = new Mutex(); 

    ThreadClass one = new ThreadClass(mut); // first instance 
    Threadclass two = new ThreadClass(mut); // second instance 

// Assign the Thread function to run on separate Thread 

} 

答えて

3

はいているよう

+0

返信と説明をありがとう。実際には、私は参照として渡すことを暗示したが、言語が混ざっていた:)。 –

1

通常、System.Threading.Mutexは、プロセス間通信のために使用されている(完全に書き直さ回答、古い答えは一番下にあります) 。同じプロセス内でスレッドを同期させたいだけなら、全体重ミューテックスを使うことは過度のことです。重要なコードが例外をスローした場合(何が起こるか想像lockアプローチ - の利点は、早期に戻り、例外安全性の可能性がある

Class ThreadClass 
{ 
    // static is important, this way the object is shared among all 
    // class instances 
    private static object myMutex = new object(); 

    public ThreadFunction() 
    { 
     // Wait until it is safe to enter. 
     lock(myMutex) 
     { 
      // critical code 
     } 
     // the mutex is automatically released after leaving the block. 
    } 
} 

Class MotherClass 
{ 
    ThreadClass one = new ThreadClass(); // first instance 
    Threadclass two = new ThreadClass(); // second instance 

    // Assign the Thread function to run on separate Thread 
} 

;しかしエリックリペットのarticle about exceptions under lockを見て:あなたはlock演算子で任意のオブジェクトを使用することができます)。 全体方法が重要であり、そしてクラスのこれ以上重要な方法がある場合は

は、あなたはそれがさらに簡単行うことができます。

Class ThreadClass 
{ 
    [MethodImpl(MethodImplOptions.Synchronized)] 
    public ThreadFunction() 
    { 
     // critical code 
    } 
} 

Class MotherClass 
{ 
    ThreadClass one = new ThreadClass(); // first instance 
    Threadclass two = new ThreadClass(); // second instance 

    // Assign the Thread function to run on separate Thread 
} 

(旧答えはのためにここに保たれています一貫性)

すべてのクラスインスタンスは、C#で参照渡しされます。あなたのミューテックスがクラス(例えば、System.Threading.Mutex)の場合、自動的に参照渡しされます。

詳細はhereをご覧ください。


訂正:
@Guffaが正常状態として、あなたは参照することにより、クラスのインスタンスを渡すことはありませんが、(refキーワードを使用していない場合)値によってクラスのインスタンスへの参照。あなたの目的のために、それは実際にはほぼ同じです。相違点は、渡された参照の変更が呼び出し先の外部では見えないことです。彼らはクラス型ではない構造体型

1

はいミューテックスが参照によって渡され、それが動作します。いいえ、それは参照渡しではありません。

参照を渡すと参照でを渡すとの重要な違いがあります。

メソッドに参照型を渡すと、通常として参照渡された:参照によってパラメータを渡すには

を、あなたはrefキーワードを使用します。

SomeMethod(ref mutex); 

メソッドシグネチャのパラメータは、refキーワードを使用して宣言する必要があります。

参照
で変数を渡す
public void SomeMethod(ref Mutex mutex) { 

は、変数ではなく、変数に含まれている参照のコピーへの参照を渡すことを意味します。メソッドは、参照が指し示すオブジェクトだけでなく、変数自体を変更することができます。

ほとんどの場合、この場合も、通常の方法でパラメータを渡す必要があります。参照を渡すことは、特定の理由で必要なときにのみ行われます。

0

あなたのブリーフィングでは、共有リソースアクセスを同期するためにMutexを使用していると仮定します。

Mutexは、アンダーカバーでWin32のアンマネージミューテックスを使用する管理参照型です。あなたの質問に答えるために、はい、それは参照型です。

しかし、あなたの質問には、二つの点

あなたが参照を心配しているのはなぜ
  1. を考えるように私をリード?

私のアドバイスは、同じMutexインスタンスが共有されることを心配している場合は、Mutexを作成してください(Mutexのコンストラクタオーバーロードを確認してください)。アンダーカバーのオペレーティングシステムは、この名前のミューテックスの同期アクセスを保証します。

  1. なぜMutexインスタンスを静的にしたいのですか?

静的変数は、AppDomainに関連付けられた特別なヒープでJITによって割り当てられます。これはLoader heapと呼ばれます。 AppDomainをアンロード/リロードしない限り、このローダーヒープはガベージコレクションされません。だから私のここでのポイントは、あなたが静的メンバーとしてMutexを使用している場合、おそらく多くのmutexハンドルを保持することになります。

関連する問題