线程访问正在使用的变量

Ale*_*lex 1 c# thread-safety

我想知道,如果我有一个多核处理器并且我有多个线程,如果两个或多个线程同时访问一个变量,程序是否会崩溃?如何暂时阻止变量以便同时限制访问?

此致,Alexandru Badescu

Jon*_*eet 5

它不会崩溃,但它可能会给出错误的结果.

要阻止,您需要确保通过同一监视器上的lock语句保护每个访问:

private readonly object monitor = new object();
private int sharedVariable;

public void MethodThatSetsVariable()
{
    lock (monitor)
    {
        sharedVariable = 5;
    }
}

public void MethodThatReadsVariable()
{
    int foo;
    lock (monitor)
    {
        foo = sharedVariable;
    }
    // Use foo now
}
Run Code Online (Sandbox Code Playgroud)

备择方案:

  • 使用volatile变量,虽然确切的行为volatile很难理解.(好吧,无论如何,它超出了我.)
  • Interlocked课堂上使用方法

请注意,当它只是您感兴趣的单个共享变量时,这两个最适合.当您必须访问一组变量时,确保您只看到完全一致的状态,锁是最简单的方法走.

另一种选择 - 如果可能的话 - 首选是避免首先要求可变共享状态.它并不总是可能,至少没有对消息传递架构进行彻底的重新设计 - 但是值得在可能的情况下进行瞄准.不可变类型可以帮助更容易实现.