寄存器读/写是否需要临界区保护?

时间:2013-01-08 19:25:13

标签: c++ concurrency windows-mobile

我有一个适用于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
}

我是否需要围绕寄存器读写的CriticalSection保护,假设它们可以从不同的线程同时调用?

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

1 个答案:

答案 0 :(得分:1)

您可以使用InterlockedExchange设置值,使用InterlockedExchangeAdd [documentation]作为加数来读取值。这些功能保证了同步访问,自WM 5起就可以使用。