联合交换结构

时间:2011-05-24 11:40:02

标签: c++ windows winapi interlocked

我想使用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无锁?

4 个答案:

答案 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位平台上)工作,因此只有一定大小值可以使用单个汇编指令执行原子操作,而不需要使用某种类型的锁或信号量来创建临界区。