2017-01-11 8 views
4

私がしたいことが名前を持っているかどうかは分かりません。 「マスター/スレーブロックシステム」は、悲しいことに私が思い付く最高の言葉です。私が持っている問題に今種類のマスター/スレーブロックシステム?

...あなたは以下のクラス持っ

を想像:私が望む何

public class Foo 
{ 
    public void Master() 
    { 

    } 

    public void Slave1() 
    { 

    } 

    public void Slave2() 
    { 

    } 
} 

をスレーブ方式(スレーブ1、Slave2を)は、多並列に実行することができるということですスレーブメソッドが実行中に実行されるのをブロックされなければならない場合、現在実行されているスレーブメソッドはすべて、マスターメソッドへの入力時に完了まで実行されなければならない。 (コメント付き)このような

何か:

public class Foo 
{ 
    public void Master() 
    { 
     //block slaves from executing 
     //wait for slaves to finish 

     //do code... 

     //unblock slaves 
    } 

    public void Slave1() 
    { 
     //if blocked by master wait, if not execute 
     //if currently running when entering master method, let it finish 
    } 

    public void Slave2() 
    { 
     //if blocked by master wait, if not execute 
     //if currently running when entering master method, let it finish 
    } 
} 

私はすべての3つの方法ではなく、スレーブ1の方法よりもロックを使用することができます知っているがお互いをブロックし、私が望むものではないthatsのだろう。

public class Foo 
{ 
    private readonly object _syncLock = new object(); 

    public void Master() 
    { 
     lock (_syncLock) //blocks Slave1, Slave2 
     { 
      //run code... 
     } 
    } 

    public void Slave1() 
    { 
     lock (_syncLock) //blocks Slave2, Master - dont want that 
     { 
      //run code... 
     } 
    } 

    public void Slave2() 
    { 
     lock (_syncLock) //blocks Slave1, Master - dont want that 
     { 
      //run code... 
     } 
    } 
} 

私は、このクラス内のソリューションを持っていると、「あなたは、それはそれを行います方法のメソッドを呼び出す場合は、」いくつかは、前述の方法は非注文方法でいつでも外に発射することができません希望可能であればそれぞれの方法は複数回実行できます。

+2

あなたが探しているものは、複数のリーダーが1つのライターロックですhttps://en.wikipedia.org/wiki/Readers%E2%80%93writer_lock – prof1990

+3

「ReaderWriterLockSlim'(* Master * = = *書き込み*、*スレーブ* == *読み取り*;読み取り専用または書き込み専用の複数のスレッド)https://msdn.microsoft.com/en-us/library/system.threading.readerwriterlockslim(v=vs.110).aspx –

+0

'ロック ' –

答えて

2

私は右のあなたを理解していれば、あなたはMaster()

  • 排他(書き込み)ロックを入れたい(ないSlaveNは実行できません)
  • 共有(読み取り)各Slaveのロック(あなたは別のSlaveNを実行することができますではなく、Master

それはあなたのケースなら、持っていてくださいReaderWriterLockSlimを見て:

public class Foo { 
    private readonly ReaderWriterLockSlim _syncLock = new ReaderWriterLockSlim(); 

    public void Master() { 
     // Exclusive (write) lock: only Master allowed to run 
     _syncLock.EnterWriteLock(); 

     try { 
     //run code... 
     } 
     finally { 
     _syncLock.ExitWriteLock(); 
     } 
    } 

    public void Slave1() { 
     // Read lock: you can run Slave2 (with another Read lock), but not Master 
     _syncLock.EnterReadLock(); 

     try { 
     //run code... 
     } 
     finally { 
     _syncLock.ExitReadLock(); 
     }   
    } 

    public void Slave2() { 
     // Read lock: you can run Slave1 (with another Read lock), but not Master 
     _syncLock.EnterReadLock(); 

     try { 
     //run code... 
     } 
     finally { 
     _syncLock.ExitReadLock(); 
     }   
    } 
} 
+0

+1。 :) 2つのマスターメソッドがあるかどうかを明確にするために、_syncLock.EnterWriteLock()を呼び出すことができます。二度ブロックし、意図したとおりにブロックするか、例外をスローしますか? –

+0

となり、すべてのメソッドがExitReadLockを呼び出すまでEnterWriteLockが待機しますか? –

+0

これは逆もありませんか?すべての読み取りロックが解除されるまで、マスターは実行をブロックされるでしょうか? – poke