我在 Windows XP 上使用 MinGW 4.6.2,我在 std::atomic 上遇到了一些奇怪的行为。情况如下:
- 线程 A 创建一个std::atomic变量(以T*作为模板参数)。
- 线程 B 修改它。
- 线程 A 等待修改然后读取变量。
最终结果是线程 A 读取的值不是线程 B 设置的值。
如果我删除 std::atomic (即将变量保存为指针),它会按预期工作。更有趣的是,如果我将模板参数设置为unsigned long并将指针转换为T*,它会按预期工作。
我使用赋值运算符来设置值和加载成员来获取值。
我是否错过了以 T* 作为参数的 std::atomic 应该如何工作,或者这是一种破坏行为?
编辑
一些代码
#include <boost/thread.hpp>
#include <atomic>
using namespace std;
void* vptr;
std::atomic<unsigned int> aui;
std::atomic<void*> aptr;
void foo()
{
vptr = (void*) 0x123;
aui = (unsigned int) 0x123;
aptr = (void*) 0x123;
}
int main(int argc, char* argv[])
{
boost::thread threadA;
vptr = nullptr;
aui = 0;
aptr = nullptr;
threadA = boost::thread(foo);
threadA.join();
cout << vptr << " " << (void*)aui.load() << " " << aptr.load();
return 0;
}
输出为:0x123 0x123 0x41d028