【发布时间】:2014-05-04 02:20:46
【问题描述】:
从这里的 MSDN (http://msdn.microsoft.com/en-us/library/aa691278(v=vs.71).aspx) 你可以看到 int,byte……等基本类型都是可读/可写原子的。所以我想知道它们都是“原子的”:
“原子操作”和“锁”有什么关系?在我看来,如果一个操作是“原子的”,我们就不再需要锁了,因为它们必须是“线程安全的”,对吗?
无论如何,网站论坛上有人告诉我,他们是对的吗?
1) 任何引用类型都是“原子操作”。
2) i++ 或 --i 等类型都不是原子操作(那么如何检查哪个操作是“原子”,哪个不是?)
我总是对这些问题感到困惑......
@Daniel Brückner 和@keshlam:
似乎像 ++i(先读/然后写)这样的混合操作不是原子操作。但是,如果我将它们分成如下两个步骤,我会对此感兴趣:
//suppose I have "i" defined and assigned a value
void Fun()
{
if(i==1)
{
i=2;
}
}
如果上面的代码会被多个线程调用,并且“if”部分只读取(原子步骤)和“i=2”(另一个原子步骤),那么我不需要锁?
【问题讨论】:
-
这句话:“任何引用类型都是'原子操作'”没有意义。类型不是操作。
-
当一个类型大于本机寄存器大小时,“不保证原子读-修改-写,例如在递增或递减的情况下。”
-
@MitchWheat:“类型大于本地寄存器大小”是什么意思?
标签: c# multithreading thread-safety