我想知道,如果我有一个多核处理器并且我有多个线程,如果两个或多个线程同时访问一个变量,程序是否会崩溃?如何暂时阻止变量以便同时限制访问?
此致,Alexandru Badescu
它不会崩溃,但它可能会给出错误的结果.
要阻止,您需要确保通过同一监视器上的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课堂上使用方法请注意,当它只是您感兴趣的单个共享变量时,这两个最适合.当您必须访问一组变量时,确保您只看到完全一致的状态,锁是最简单的方法走.
另一种选择 - 如果可能的话 - 首选是避免首先要求可变共享状态.它并不总是可能,至少没有对消息传递架构进行彻底的重新设计 - 但是值得在可能的情况下进行瞄准.不可变类型可以帮助更容易实现.