Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 跳过已使用的锁定节_C#_Multithreading - Fatal编程技术网

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及其获取/发布语义含义。