寄存器读/写是否需要关键部分保护? 我有一个Visual Studio 2008 C++项目,用于Windows Mobile 6的ARMv4i,在这里我有这样的代码: // 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 }

寄存器读/写是否需要关键部分保护? 我有一个Visual Studio 2008 C++项目,用于Windows Mobile 6的ARMv4i,在这里我有这样的代码: // 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 },c++,concurrency,windows-mobile,C++,Concurrency,Windows Mobile,假设可以从不同线程同时调用寄存器读写操作,那么我是否需要对寄存器读写操作进行CriticalSection保护 正如我在WM ARMV4I上所理解的,DWORD对齐的DWORD读/写是原子的,易失性保证了WM中的内存获取/释放语义。因此,CS保护应该是不必要的。我说的对吗?您可以使用InterlockedExchange设置一个值,并使用InterlockedExchange Add将零作为加数读取一个值。这些功能保证了同步访问,并且从WM 5开始就可用。我认为volatile不能保证任何东西。

假设可以从不同线程同时调用寄存器读写操作,那么我是否需要对寄存器读写操作进行CriticalSection保护


正如我在WM ARMV4I上所理解的,DWORD对齐的DWORD读/写是原子的,易失性保证了WM中的内存获取/释放语义。因此,CS保护应该是不必要的。我说的对吗?

您可以使用
InterlockedExchange
设置一个值,并使用
InterlockedExchange Add
将零作为加数读取一个值。这些功能保证了同步访问,并且从WM 5开始就可用。

我认为
volatile
不能保证任何东西。。。也许您的编译器对此有非标准的保证?是的,这是volatile的一个特定于microsoft的特性。对于mvc,这可能是可行的,但为什么有这些强制转换((易失性无符号长常量)?仅供参考,ARM7TDMI处理器使用寄存器来禁用和启用中断(进入和离开关键部分的一种形式)。因此,关键部分取决于处理器。很可能,一个或两个寄存器加载不需要关键部分。@mgr-强制转换是Windows Mobile特定宏的扩展,我不希望任何人识别。如果有帮助,我将它们添加到内联注释中。当然,但这只是另一种同步方法。我的问题不是如何同步,而是如果有必要的话。是的,这是必要的。虽然
volatile
确保指令顺序不会被打乱,但它不能保证体系结构上的一致读/写。上的一篇文章介绍了编译器可能知道或不知道的一些ARM细节,所以使用crit.section或locks非常合适。谢谢你给我指出这篇文章。这篇文章提供了一些非常好的信息。