2

我有一个适用于 Windows Mobile 6 ARMV4I 的 Visual Studio 2008 C++ 项目,其中有如下代码:

// list of CPU registers (all DWORD aligned)
typedef volatile struct
{
    // status register
    DWORD my_status;
} MY_REGS;

MY_REGS* my_regs;

// reads the status register
DWORD ReadMyStatus()
{
    DWORD status;
    // EnterCriticalSection()
    // equivalent to:
    //     status = INREG32( &my_regs->my_status );
    status = ( *( volatile unsigned long* const )( &my_regs->my_status ) );
    // LeaveCriticalSection()
    return status;
}

// sets a bit in the status register
DWORD SetMyStatus( DWORD status )
{
    // EnterCriticalSection()
    // equivalent to:
    //     SETREG32( &my_regs->my_status, status );
    ( *( volatile unsigned long* const )( &my_regs->my_status ) ) = 
        ( ( *( volatile unsigned long* const )( &my_regs->my_status ) ) | ( status ) );
    // LeaveCriticalSection
}

假设可以从不同的线程同时调用它们,我是否需要围绕寄存器读取和写入进行关键部分保护?

正如我在 WM ARMV4I 上所理解的那样,与 DWORD 对齐的 DWORD 读/写是原子的,并且易失性保证了 WM 中的内存获取/释放语义。因此,CS 保护应该是不必要的。我对么?

4

1 回答 1

1

您可以使用InterlockedExchange设置一个值和以零作为加数的InterlockedExchangeAdd [documentation]来读取一个值。这些功能保证了同步访问,并且从 WM 5 开始可用。

于 2013-06-03T11:31:38.600 回答