Windows Mobile6ARMV4I用のVisualStudio2008 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保護は不要です。私は正しいですか?