RAII 解决方案将是传统的:
struct CriticalSection {
int saved_status_;
void Enter() {
saved_status_ = CPU_STATUS_REGISTER;
__disable_irq();
}
CriticalSection() { Enter(); }
void Exit() {
CPU_STATUS_REGISTER = saved_status_;
}
~CriticalSection() {
Exit(); // Can you call this more than once safely? Dunno.
}
};
你会这样使用它:
void foo() {
// unprotected code goes here
{
CriticalSection _;
// protected code goes here
}
// unprotected code goes here
}
在没有任何状态的情况下这样做是不可能的,因为这CPU_STATUS_REGISTER
是一个运行时值。C/C++ 中的状态主要存储在变量中。
我强烈怀疑,在任何非平凡的优化级别下,上述 RAII 类将编译为与您的宏编译成完全相同的代码,除非您不再需要记住 EXIT_CRITICAL()。