【发布时间】:2012-07-21 07:22:55
【问题描述】:
如果您在一个锁代码块内有多个共享变量赋值,这是否一定意味着所有这些更改对其他线程立即可见,一旦进入锁语句就可能在其他处理器上运行在同一个对象上 - 或者没有这样的保证?
那里的许多示例显示了一个单个“设置”或“获取”一个公共变量,并详细介绍了内存屏障,但是如果里面有一组更复杂的语句会发生什么?甚至可能执行其他操作的函数调用?
类似这样的:
lock(sharedObject)
{
x = 10;
y = 20;
z = a + 10;
}
如果此代码在另一个线程上运行,而该线程可能在另一个处理器上执行,它是否对更改的“可见性”做出任何保证?
lock (sharedObject)
{
if (y == 10)
{
// Do something.
}
}
如果答案是否 - 也许并说明何时这些变化可能会变得可见?
【问题讨论】:
-
是的,锁意味着内存屏障。纯粹是因为没有一个就无法实现可靠的锁。
标签: c# synchronization thread-safety locking