【发布时间】:2012-05-14 08:03:54
【问题描述】:
我一直在问自己:“为什么我应该只对一个语句使用锁定”...
(恕我直言 - 如果它的 1 操作只是像赋值 - 所以应该没有问题..)?
然后我看到了这个:
作为基本规则,您需要锁定访问任何可写共享 场地。即使在最简单的情况下——对单个的赋值操作 字段—您必须考虑同步。在接下来的课程中, Increment 和 Assign 方法都不是线程安全的:
class ThreadUnsafe
{
static int _x;
static void Increment() { _x++; }
static void Assign() { _x = 123; }
}
你能告诉我为什么这不是线程安全的吗? 我在脑海中运行了许多脚本,但找不到任何问题...
【问题讨论】:
-
Increment不安全(3 次操作)。Assign也是不安全的(1 个原子操作,但您需要通过缓存处理内存同步)。 -
@Soohjun 增量是原子操作(INC dword ptr [ebp-3Ch])
-
@YoryeNathan 这不是原子的。见MSDN。
-
如果你不想在你的单个语句周围加锁,你可以使用内置的联锁类来为你做这件事,例如
static void Increment() { Interlocked.Increment(ref _x);} -
@YoryeNathan 您误解了“原子”的含义。这并不意味着“一个 CPU 指令”。例如,
INC dword ptr [ebp-3Ch]是但原子的一切。它本质上是进行加载、公司、存储。
标签: c# .net multithreading .net-4.0