我有一个用于 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 保护应该是不必要的。我说得对吗?
最佳答案
您可以使用InterlockedExchange
设置一个值和InterlockedExchangeAdd
[documentation]以零作为加数来读取一个值。这些函数保证了同步访问并且从 WM 5 开始可用。
关于c++ - 寄存器读/写是否需要临界区保护?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14222545/