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

问题描述 投票:1回答:1

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

然而,有一些悬而未决的问题

  1. 为了保证线程安全,我假设我需要为读写访问添加一个信号量但是...
  2. 如果一个线程只需要更新结构的某些元素,我需要将它指向该结构的指针,但是一旦我开始使用指针引用,我就不能再使用信号量来保护我的访问。那么如何在不违反线程安全的情况下允许线程修改单个struct元素呢?
  3. 是否有更好的方式来获得像我计划使用的那样的global store?谷歌没有提供太多提示。
c store freertos
1个回答
4
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.