c ++多线程 - 锁定一个指针赋值?

时间:2011-10-14 23:45:16

标签: multithreading

我有一个方法如下

SomeStruct* abc;

void NullABC()
{
    abc = NULL;
}

这只是一个例子而且不是很有趣。 许多线程可以同时调用此方法。 我需要锁定“abc = NULL”行吗? 我认为它只是指针,所以它可以一次性完成,并不是真的需要它,但只是想确保。

由于

3 个答案:

答案 0 :(得分:1)

这取决于您运行的平台。在许多平台上,只要abc正确对齐,写入就是原子的。

但是,如果您的平台没有这样的保证,则需要使用锁,原子变量或互锁操作来同步对变量的访问。

答案 1 :(得分:0)

不,你不需要锁,至少不需要在x86上。在现实世界的情况下,需要一个内存屏障,而锁定是获得此功能的一种方式(另一种方法是explicit barrier)。如果需要访问原始指针,您还可以考虑使用互锁操作,如VisualC的InterlockedExchangePointer。大多数编译器都支持相同的内在函数。

答案 2 :(得分:0)

如果没有其他线程使用abc用于任何其他目的,那么显示的代码很好......但是当然有一个永远不会被使用的指针除了将其设置为NULL之外有点愚蠢。

如果某个地方有其他类似的代码,OTOH:

if (abc != NULL)
{
   abc->DoSomething();
}

然后在这种情况下,使用abc指针的代码(上面)和更改它的代码(你发布的代码)都需要在访问(abc)之前锁定互斥锁。否则,如果在if语句之后但在DoSomething()调用之前将abc的值设置为NULL,则上面的代码可能会崩溃。

如果其他代码执行此操作,则会出现临界情况:

SomeStruct * my_abc = abc;
if (my_abc != NULL)
{
   my_abc->DoSomething();
}

这可能会有效,因为在将abc指针的值复制到my_abc时,abc的值为NULL或者它不是......而my_abc是局部变量,因此其他线程不会能够在调用DoSomething()之前更改它。上面理论上可以在一些平台上打破,虽然指针的复制不是原子的(在这种情况下,my_abc可能最终成为一个无效的指针,有abc的位和半个NULL位)......但普通的/ PC硬件会复制原子指针,所以它应该不是问题。不管怎样,为了偏执狂的缘故,使用Mutex可能是值得的。