我正在尝试同时原子地读取三个变量
约束条件是
编辑:平台是 ARMv7M 架构,在裸机环境下运行。
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 架构,在裸机环境下运行。
union { struct foo { _Atomic uint32_t a,b,c; } together; _Atomic struct { uint32_t a,b,c;} separate;}
或类似的结构中。类似于如何使用c++11 CAS实现ABA计数器?,以便一次只能有效访问一个。 - Peter Cordesatomic_compare_exchange_weak
。只有4字节的ldrex
/strex
,显然甚至没有2寄存器的ldrexd
/strexd
。那个评论是对我第一个评论的跟进,当时你刚好发表了评论,而不是回复你的评论。 - Peter Cordes