我有一个适用于 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 保护应该是不必要的。我对么?