c - 如何在 C 中一次原子地读取多个变量?

标签 c arm thread-safety atomic cortex-m

我试图一次原子地读取三个变量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/

相关文章:

linux - ARM 上的休眠 Linux

java - Java的for循环中是否有线程安全优化?

java - 动画线程和 EDT

c - scanf 未终止

c - 如何计算文件给定行上的元素数量?

c++ - C++ Small vs All Caps数据类型

c++ - std::runtime_error::what() 在使用嵌套异常时导致访问冲突

android - 如何为具有 64 位 CPU 的设备构建 .so 二进制文件?

java - 并发 HashMap 迭代器 :How safe is it for Threading?

c - 不存在的 sstk() 系统调用的用法示例?