互锁交换结构

| 我想从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;
    }
};
一个线程可以设置一个新值,而另一个线程可以读取该值。 现在我要做的就是将ѭ1的值更改为
struct
。 WinAPI中有什么方法可以免费复制
struct
锁?     
已邀请:
除非您可以将结构调整为32位,否则不存在,在这种情况下,您可以继续使用InterlockedExchange。     
您可以在64位平台和Windows Vista / 7上使用InterlockedExchange64对64位值进行原子操作。这足以将两个32位
int
值放入一个结构中。 由于该函数是使用编译器内部函数实现的,因此它基本上是在x86上调用依赖于平台的汇编指令,例如
CMPXCHG
。由于该指令最多只能在64位寄存器源操作数,64位寄存器或存储器目标操作数以及
RAX
寄存器上工作(在64位平台上),因此只能执行某个大小的值使用单个汇编指令的原子操作,而无需合并某种类型的锁或信号量来创建关键部分。     
仅当该结构正好是32位时。 一种替代方法是在指向结构的指针上使用InterlockedExchange。该结构必须是不可变的(或永远不要更改)。要更新该结构,请制作一个新的结构,然后交换指针。您必须小心销毁该结构,以确保仅执行一次且仅当没有人使用它时才执行。     
最好的办法是使用
InitializeCriticalSectionAndSpinCount
函数,如果可以足够快地获得所有权,它将不会等待锁定。     

要回复问题请先登录注册