我有一个适用于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保护应该是不必要的。我是对的吗?
答案 0 :(得分:1)
您可以使用InterlockedExchange
设置值,使用InterlockedExchangeAdd
[documentation]作为加数来读取值。这些功能保证了同步访问,自WM 5起就可以使用。