C# 跳过已使用的锁定节
我有一个关键部分,它只执行一次,但被许多场景调用。如何执行此线程进程并跳过所有其余调用C# 跳过已使用的锁定节,c#,multithreading,C#,Multithreading,我有一个关键部分,它只执行一次,但被许多场景调用。如何执行此线程进程并跳过所有其余调用 提前感谢。锁定是首选方法;除非你有更详细的要求 编辑:添加“仅一次”表示锁定不足 锁定是首选方法;除非你有更详细的要求 // Assuming this uses calls from multiple threads, I used volatile. volatile bool executed = false; object lockExcecuted = new object(); void DoS
提前感谢。锁定是首选方法;除非你有更详细的要求
编辑:添加“仅一次”表示锁定不足 锁定是首选方法;除非你有更详细的要求
// 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
}
编辑:添加“仅一次”表示锁定不足 使用
lock
只允许一个线程访问关键部分,并且在关键部分完成时设置一个标志,表明它已完成 使用lock
只允许一个线程访问关键部分,并且在关键部分完成时设置一个标志,表明它已完成 取决于您的情景。如果此部分返回一个值,u可以使用.Net 4.0的新功能-
// 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
}
public static bool hasExecuted = false;
static readonly object lockObject = new object();
static void Method()
{
lock(lockObject)
{
if(!hasExecuted)
{
// run code
hasExecuted = true;
}
}
}
当然,您总是可以在ur critical section中设置一个标志,并在执行之前检查其值(有时在使用singleton模式时会这样做)取决于ur场景。如果此部分返回一个值,u可以使用.Net 4.0的新功能-
当然,您始终可以在ur critical section内设置一个标志,并在执行之前检查其值(这有时是在使用单例模式时执行的)如果仅在锁块内执行,则执行时不需要volatile。在锁块的开始和结束处有一个内存屏障,使任何读/写操作对其他线程可见。Exchange奇怪地不支持
bool
。是的,您必须使用int而不是bool来进行联锁。Exchange。@Peter:您能给我指出一个关于不需要volatile的语句的参考吗?是一个,;ECMA 335第12.6.5节和第12.6.7节详细介绍了Monitor.Enter/Exit及其获取/释放语义含义。如果仅在锁块内执行,则执行时不需要volatile。在锁块的开始和结束处有一个内存屏障,使任何读/写操作对其他线程可见。Exchange奇怪地不支持bool
。是的,您必须使用int而不是bool来进行联锁。Exchange。@Peter:您能给我指出一个关于不需要volatile的语句的参考吗?是一个,;ECMA 335第12.6.5和12.6.7节详细说明了Monitor.Enter/Exit及其获取/发布语义含义。