WindowsXPでMinGW4.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