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

时间:2019-03-11 09:52:35

标签: c store freertos

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

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

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

1 个答案:

答案 0 :(得分:4)

让我与您分享处理这种情况的最常见的C方法。

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

在由不透明指针标识的每个结构定义中,都有一个mutex FreeRTOS在信号量的术语中实现了互斥体)以在线程安全的情况下访问结构成员方式。创建互斥锁时必须使用xSemaphoreCreateMutex。当您要访问可能由多个任务访问的成员数据时,在所有API中都使用xSemaphoreGivexSemaphoreTake