我想使用WinAPI中的InterlockedExchange来使用无锁的线程同步 目前我有这样的课程。
struct DataExchange
{
volatile LONG m_value;
void SetValue(LONG newVal)
{
InterlockedExchange(&m_value, newVal);
}
LONG GetValue()
{
LONG workVal=0;
InterlockedExchange(&workVal, m_value);
return workVal;
}
};
一个线程可以设置一个新值,另一个线程可以读取该值
现在我想要做的是将LONG
值更改为struct
。
在WinAPI中有什么方法可以复制struct
无锁?
答案 0 :(得分:3)
除非你的结构符合32位,否则没有,在这种情况下你可以继续使用InterlockedExchange。
答案 1 :(得分:1)
仅当结构正好是32位时。
另一种方法是在指向结构的指针上使用InterlockedExchange。结构必须是不可变的(或永远不会改变它)。要更新结构,请创建一个新结构,然后交换指针。你必须小心破坏结构以确保它只进行一次,并且只有在没有人使用结构时才会这样做。
答案 2 :(得分:1)
您可以做的最好的事情是使用InitializeCriticalSectionAndSpinCount
功能,如果可以足够快地获得所有权,则不会等待锁定。
答案 3 :(得分:1)
您可以在64位平台和Windows Vista / 7上使用InterlockedExchange64对64位值进行原子操作。这足以在结构中容纳两个32位int
值。
由于函数是使用complier instrinsic实现的,因此它基本上在x86上调用依赖于平台的汇编指令,如CMPXCHG
。由于该指令仅在64位寄存器源操作数,64位寄存器或存储器目标操作数以及RAX
寄存器上最多(在64位平台上)工作,因此只有一定大小值可以使用单个汇编指令执行原子操作,而不需要使用某种类型的锁或信号量来创建临界区。