2011-12-28 3 views
3

the lock statementを使用すると、別のスレッドがクリティカルセクションにある間に、あるスレッドがクリティカルセクションに入り込まないようにすることができます。 "lockステートメントのように相互排除をどうやって達成するのですか?ロックされているとブロックはスキップされますか?

私は何をしたい行動が別のスレッドがロックされたコードを入力しようとすると、それだけで(代わりに解放されるロックを待っているの)コード全体をスキップするということですか?私の心に来てアイデアは、

if(flag) return; 
flag = true; 
//do stuff here 
flag =false; 

のようなものをフラグを使用しているしかし、私は2つのスレッドがtrueに設定され、誰の前に最初の行を渡すことができるので、これは安全ではありません知っている、またはフラグがfalseに設定されていないされています例外の場合..あなたは改善や代替を提案できますか?

答えて

5

Monitor.TryEnterの使用this overloadを、スキップすることを意味0秒をお待ちしております。

指定されたオブジェクトの排他的ロック を取得しようとしました。

戻り値型:現在のスレッドがブロックせずに ロックを取得した場合に可能System.Booleanはtrue。それ以外の場合はfalseです。あなたのケースでは

、あなたはおそらくTimeSpan.Zero近くのタイムアウトを使用します。 TimeSpan引数を受け付けないMonitor.TryEnter

あなたがのための時間の任意の長さを待つためにロックを取得しようとするスレッドをしたくない場合は、あなたができるだけthis overload、。このメソッドはすぐに待たずに戻ります。使用しようとしているフラグ技法の感情に非常に近いです。

+0

なぜゼロに近いタイムアウトを使用したいと思いますか?なぜゼロではないのですか? –

+0

@ルイス:あなたはゼロのタイムスパンを使うことができます(または、同じように、 'TimeSpan'をとらない別のオーバーロードを使うこともできます)。あきらめる前に、少なくとも少量の時間リソースを待つことはかなり一般的です。あなたがしたくなければ、あなたはする必要はありません。 :) – Ani

1

あなたは、スレッドの数が限られた時間で、コードの一部にアクセスすることができると言うことができセマフォを使用することにより0ミリ秒

リミット1およびタイムアウト期間をSemaphoresを必要としています。

はタイムアウト時間= 0を指定しますが

bool WaitOne(int millisecondsTimeout) 

を待っているため、この方法を使用する必要が

にそれを使用する方法についてはthis sampleを参照してください。この方法であなたの待機スレッドは、彼らは単にあなたがタイムアウトを指定することができますコード

Example

class SemaphoreExample  
{ 
// Three reserved slots for threads 
public static Semaphore Pool = new Semaphore(1, 0); 

public static void Main(string[] args) 
{  
// Create and start 20 threads  
for (int i = 0; i < 20; i++) 
{ 
    Thread t = new Thread(new ThreadStart(DoWork)); 
    t.Start(); 
} 

Console.ReadLine();  
} 

private static void DoWork()  
{  
// Wait 0 miliseconds 
SemaphoreExample.Pool.WaitOne(0); 


#region Area Protected By Semaphore  
Console.WriteLine("Acquired slot..."); 

for (int i = 0; i < 10; i++) 
{ 
    Console.WriteLine(i + 1); 
} 
Console.WriteLine("Released slot...");  

#endregion   
// Release the semaphore slot  
SemaphoreExample.Pool.Release();  
}  
} 
+0

を使用することができますどのように機能するのですか? –

+0

更新された回答を参照 –

関連する問題