【发布时间】:2014-03-29 02:22:08
【问题描述】:
关于这个问题Is there cases where a 32-bit variable could not been properly-aligned 和提供的答案,我可以假设我在 windows 平台下工作时可以交换地址而没有任何副作用吗?
例如:
struct Foo
{
// whatever Foo can hold
};
struct Bar
{
void buildFoo()
{
auto tmp = new Foo;
// do some stuff on tmp, or not
foo = tmp;
}
Foo* foo;
};
现在,让一些线程通过Bar 的实例使用foo,而其他线程调用Bar::buildFoo(),会有什么后果?
【问题讨论】:
-
交换通常不是原子的。它必须读取两个值,并写入两个值。 (所以当交换
a和b时,a以b的旧值结束,b以a的旧值结束) -
jalf 说得对,swapping 通常不是原子的,但是 Windows 确实提供了诸如 InterlockedExchangePointer 之类的方法来执行交换。
-
请注意,您不是
swap,而是分配。 -
还要注意,指针可能是 64 位的。
-
@Jarod42:确实,我不是在交换。谢谢。
标签: c++ windows multithreading