gpt4 book ai didi

c++ - WinAPI _Interlocked* char 的内部函数,short

转载 作者:搜寻专家 更新时间:2023-10-31 00:46:30 26 4
gpt4 key购买 nike

我需要在 char 或 short 上使用 _Interlocked*** 函数,但它需要 long 指针作为输入。似乎有函数 _InterlockedExchange8,我没有看到任何相关文档。看起来这是未记录的功能。编译器也无法找到 _InterlockedAdd8 函数。如果能提供有关该功能的任何信息、使用/不使用的建议以及其他解决方案,我将不胜感激。

更新 1

我会尽量简化这个问题。我怎样才能使它工作?

struct X
{
char data;
};

X atomic_exchange(X another)
{
return _InterlockedExchange( ??? );
}

我看到两种可能的解决方案

  1. 使用_InterlockedExchange8
  2. 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;
};

谢谢。

最佳答案

创建 8 位和 16 位互锁函数非常容易,但它们不包含在 WinAPI 中的原因是 IA64 的可移植性。如果您想支持 Win64,则汇编器不能内联,因为 MSVC 不再支持它。作为外部函数单元,使用 MASM64,它们不会像内联代码或内部函数那样快,因此您最好研究促进算法改用 32 位和 64 位原子操作。

示例互锁 API 实现:intrin.asm

关于c++ - WinAPI _Interlocked* char 的内部函数,short,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5074377/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com