2012-05-15 49 views
1

我有一个关键部分只能执行一次,但会被许多方案调用。我怎样才能执行这个线程处理程序并跳过所有其他的调用?正在使用跳过锁定部分

在此先感谢。

回答

4
// Assuming this uses calls from multiple threads, I used volatile. 
volatile bool executed = false; 
object lockExcecuted = new object(); 

void DoSomething() 
{ 
    lock (lockExecuted) 
    { 
     if (executed) return; 
     executed = true; 
    } 
    // do something 
} 
+0

如果执行过程只存在于锁定块中,那么执行时不需要volatile。在锁块的开始和结尾有一个内存屏障,使其他线程可以看到任何读/写操作。 –

+0

Interlocked.Exchange奇怪地不支持'bool'。 –

+0

是的,你必须使用int而不是bool来实现Interlocked.Exchange。 –

0

锁是首选的方法;除非你有更详细的要求。

编辑:增加“仅一次”意味着锁定不足。

0

使用lock只允许一个线程访问关键部分,并在完成时设置一个标志表示完成。

1
public static bool hasExecuted = false; 

static readonly object lockObject = new object(); 

static void Method() 
{ 
    lock(lockObject) 
    { 
     if(!hasExecuted) 
     { 
      // run code 
      hasExecuted = true; 
     } 
    } 
} 
0

取决于你的情况。如果此部分返回一个值,u可以使用.NET 4.0的新功能 - Lazy(T)

当然,你总是可以只设置乌尔临界段内的标志,并在执行前检查它的值(有时是在使用单例模式时完成)