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

po.*_*.pe 1 c store freertos

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

尽管如此,仍有一些悬而未决的问题

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

aep*_*aep 5

让我与您分享处理此类场景的最常见的 C 方式。

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

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