char または short で _Interlocked*** 関数を使用する必要がありますが、入力として long ポインターが必要です。関数 _InterlockedExchange8 があるようですが、それに関するドキュメントはありません。これは文書化されていない機能のようです。また、コンパイラは _InterlockedAdd8 関数を見つけることができませんでした。その機能、使用する/使用しないことの推奨事項、およびその他の解決策に関する情報をいただければ幸いです。
更新 1
質問を単純化してみます。どうすればこれを機能させることができますか?
struct X
{
char data;
};
X atomic_exchange(X another)
{
return _InterlockedExchange( ??? );
}
考えられる解決策が 2 つあります
- 使用する
_InterlockedExchange8
- long にキャスト
another
し、交換を行い、結果を X にキャストします
最初のものは明らかに悪い解決策です。2 番目の方が見栄えが良いですが、どのように実装しますか?
更新 2
このようなことについてどう思いますか?
template <typename T, typename U>
class padded_variable
{
public:
padded_variable(T v): var(v) {}
padded_variable(U v): var(*static_cast<T*>(static_cast<void*>(&v))) {}
U& cast()
{
return *static_cast<U*>(static_cast<void*>(&var));
}
T& get()
{
return var;
}
private:
T var;
char padding[sizeof(U) - sizeof(T)];
};
struct X
{
char data;
};
template <typename T, int S = sizeof(T)> class var;
template <typename T> class var<T, 1>
{
public:
var(): data(T()) {}
T atomic_exchange(T another)
{
padded_variable<T, long> xch(another);
padded_variable<T, long> res(_InterlockedExchange(&data.cast(), xch.cast()));
return res.get();
}
private:
padded_variable<T, long> data;
};
ありがとう。