我试图一次原子地读取三个变量a, b, c
。该模式类似于下面的代码。
_Atomic uint32_t a, b, c;
void thread_high_priority(void)
{
atomic_fetch_sub_explicit(&a, 1, memory_order_relaxed);
atomic_fetch_add_explicit(&b, 1, memory_order_relaxed);
atomic_fetch_sub_explicit(&c, 1, memory_order_relaxed);
}
void thread_low_priority(void)
{
uint32_t _a = a;
uint32_t _b = b;
uint32_t _c = c;
}
thread_high_priority
是一个以高优先级运行的线程,thread_low_priority
以低优先级运行。 thread_high_priority
可以打断thread_low_priority
的执行,反之则不行。也就是说,thread_high_priority
将始终不间断地运行。
约束是 thread_high_priority
是时间关键的。因此,我不想使用互斥量来阻塞,因为它很耗时,甚至会导致死锁。有没有办法确保同时读取所有三个变量而不会中断?
编辑:该平台是运行在裸机环境中的ARMv7M架构。
最佳答案
您可以通过间接级别解决此问题。
只要只有一个作家,你可以这样做:
- 将一组数据项放在一个结构中
- 分配几个这样的结构
- 以非原子方式写入读者未使用的结构成员
- 以原子方式更改读者应使用的结构指针
读者应该读取指针然后访问相应结构中的数据。
如果在主上下文仍在读取时可能发生另一个中断,那么您需要保留一个指向读取器正在使用的结构的指针,并且编写器可以在填充结构之前检查它。如果只有一个读者,则以原子方式访问第二个指针会更容易。
为了解决问题,您可以分配三个或更多结构,并将它们视为环形缓冲区。
关于c - 如何在 C 中一次原子地读取多个变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72739262/