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

标签 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 保护应该是不必要的。我说得对吗?

最佳答案

您可以使用InterlockedExchange 设置一个值和InterlockedExchangeAdd [documentation]以零作为加数来读取一个值。这些函数保证了同步访问并且从 WM 5 开始可用。

关于c++ - 寄存器读/写是否需要临界区保护?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14222545/

相关文章:

python - 检查现有进程是否存在 - 如果存在,则与其通信,否则创建一个新进程

.net - 2010 年对 .NET Compact Framework 的更新?

c# - 找不到数据成员

css - 按钮不显示

c++ - -0 和 0 有什么区别?

c++ - 如何获取 curlpp 响应头

java - 线程池调用阻塞方法

java - Java多线程和文件

c++ - makefile 中 CXX 的值从何而来?

c++ - 访问 try-catch block 外的变量