2011-12-28 4 views
3

the lock statement을 사용하면 다른 스레드가 중요한 섹션에있는 동안 한 스레드가 중요한 코드 섹션에 들어가지 않도록 할 수 있습니다. 다른 스레드가 잠긴 코드를 입력하려고하면 개체가 해제 될 때까지 블록을 기다립니다 . "lock 문과 같이 상호 배타를 어떻게 달성 할 수 있습니까? 블록이 잠겨 있으면 건너 뛸 수 있습니까?

원하는 동작이 다른 스레드가 잠긴 코드를 입력하려고하면 잠금을 해제 할 때까지 기다리지 않고 전체 코드를 건너 뛸 것입니다. 내 마음에 와서 생각은

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

처럼 뭔가를 플래그를 사용하지만, 사람이 참으로 설정하기 전에 두 스레드가 첫 번째 라인을 통과 할 수 있기 때문에 나는이 안전하지 않습니다 알고, 또는 플래그는 false로 설정 적이되고 예외가있는 경우 .. 개선안이나 대안을 제안 할 수 있습니까?

답변

5

Monitor.TryEnter의 사용 this overload을 건너 의미 0초을 기다립니다.

지정한 시간 동안 지정된 개체에 대해 잠금을 획득하려고 시도합니다.

반환 값 형식 : System.Boolean 현재 스레드가 차단없이 잠금을 얻으면 true이고, 그렇지 않으면 false입니다. 그렇지 않으면 false입니다. 귀하의 경우에는

, 당신은 아마TimeSpan.Zero에 가까운 의 타임 아웃을 사용하고 싶습니다. TimeSpan 인수를 허용하지 않습니다 Monitor.TryEnter

당신이 시간의 길이를 기다려야하는 잠금을 시도하는 스레드를하지 않으려면, 당신이 할 수있는 단지 this overload. 이 방법은 사용하지 않으려는 플래그 기술의 정서에 아주 가깝게 기다리지 않고 즉시 반환됩니다.

+0

왜 제 시간에 거의 타임 아웃을 사용하고 싶습니까? 왜 제로가 아닌가? –

+0

@ 루이스 : 0의 시간 간격을 사용할 수 있습니다 (또는 같은 시간대에 'TimeSpan'을 사용하지 않는 다른 오버로드를 사용할 수 있습니다).포기하기 전에 최소한의 시간 동안 리소스를 기다리는 것이 일반적입니다. 당신이 원하지 않는다면, 당신은 필요가 없습니다. :) – Ani

1

당신은 당신이 스레드의 제한된 수의 한 번에 코드 조각에 액세스 할 수 있는지 말할 수 세마포어를 사용하여 제한 1 시간 초과 기간이 0 밀리 초

Semaphores이 필요합니다.

당신은

bool WaitOne(int millisecondsTimeout) 

이 타임 아웃 기간 = 0을 지정 기다리고있는이 방법을 사용할 필요가

를 사용하는 방법에 대한 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

업데이트 된 답변보기 –