临界区通过constexpr
Critical section via constexpr
在嵌入式编程中,需要创建代码的原子部分——即所谓的临界部分。它们通常通过宏实现,例如:
#define ENTER_CRITICAL() int saved_status_ = CPU_STATUS_REGISTER; __disable_irq();
#define EXIT_CRITICAL() CPU_STATUS_REGISTER = saved_status_
。在进入中断状态(启用或禁用)时保存;一退出,它就恢复了。问题是需要额外的变量。
我的问题是:是否有可能通过constexpr函数来创建临界区(并摆脱宏等等)?
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()。
相关文章:
- 在同步问题中,弱指针可以代替互斥锁或临界区吗?
- 多线程环境下,其他线程永远无法访问临界区
- 如果一个线程在临界区上调用Acquire(),如果另一个线程调用Release(),该锁会被释放吗?
- 是否需要临界区?
- 当我的堆栈加倍时,它会给我临界区错误!_ctrlvalidHeappointer
- 确定Windows线程是否处于临界区或类似的位置
- 这段代码是一个工作的临界区包装器类吗?
- 临界区通过constexpr
- 临界区队列
- 出乎意料的性能提升与OpenMP临界区
- 如何使用Boost创建临界区?
- 临界区最简单的实现
- 由两个线程访问的共享队列的临界区代码是什么?
- c++ 11有临界区吗?
- 如何避免临界区和SendMessage之间的死锁
- Windows临界区公平性
- 线程同步-临界区或互斥锁
- 是否寄存器读/写需要临界区保护
- 如何在两个类之间共享单个临界区
- 什么是临界区