我需要在 char 或 short 上使用 _Interlocked*** 函数,但它需要 long 指针作为输入。似乎有函数_InterlockedExchange8,我没有看到任何文档。看起来这是未记录的功能。编译器也找不到 _InterlockedAdd8 函数。我将不胜感激有关该功能的任何信息,使用/不使用的建议以及其他解决方案。
更新 1
我会尽量简化这个问题。我怎样才能使这项工作?
struct X
{
char data;
};
X atomic_exchange(X another)
{
return _InterlockedExchange( ??? );
}
我看到了两种可能的解决方案
- 利用
_InterlockedExchange8
- 转换
another
为 long,进行交换并将结果转换回 X
第一个显然是不好的解决方案。第二个看起来更好,但是如何实现呢?
更新 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;
};
谢谢。