在 C 中创建线程安全的全局存储

Create thread safe global store in C

我正在 FreeRTOS 上编写应用程序 运行,其中我有不同的线程,它们都必须访问(读取和写入)相同的数据结构。 所以我想我可以实现一个全局数据存储,将所有数据保存在一些分组结构中。我也考虑过使用 SQLite 之类的东西,但我认为这对我的应用程序来说太过分了。

不过还有一些悬而未决的问题

  1. 为了保证线程安全,我假设我需要为我的读写访问添加一个信号量,但是...
  2. 如果线程只需要更新结构的某些元素,我需要将指向该结构的指针交给它,但是一旦我开始使用指针引用,我就无法再使用信号量保护我的访问。那么如何允许线程修改单个结构元素而不违反线程安全?
  3. 有没有比我计划使用的更好的方法来获得类似 global store 的东西? Google 没有给出太多提示。

我来分享一下处理此类场景最常见的C方式。

为了避免暴露大量全局数据,请使用 opaque pointers 并有一个 API 列表,这些 API 将不透明指针作为参数。通过这种方式,您可以拥有一组干净的 API 来访问所有结构,而将实现细节留在 .c 文件中。使用 opaque pointers 的好处是没有人知道如何处理指向数据的类型,除了接受 opaque 指针作为参数的 API。这为您的结构提供了保护和封装,以便您可以使用您提供的 API 访问或更改它们。

在每个由不透明指针标识的结构定义中,有一个mutexFreeRTOS 已经根据信号量 实现了互斥锁)来访问结构成员以线程安全的方式。创建互斥量时必须使用 xSemaphoreCreateMutex。在您的所有 API 中,当您想要访问可能被多个任务访问的成员数据时,请使用 xSemaphoreGive & xSemaphoreTake