我有一个方法如下
SomeStruct* abc;
void NullABC()
{
abc = NULL;
}
这只是一个例子而且不是很有趣。 许多线程可以同时调用此方法。 我需要锁定“abc = NULL”行吗? 我认为它只是指针,所以它可以一次性完成,并不是真的需要它,但只是想确保。
由于
答案 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可能是值得的。