在 C 中创建线程安全的全局存储
Create thread safe global store in C
我正在 FreeRTOS 上编写应用程序 运行,其中我有不同的线程,它们都必须访问(读取和写入)相同的数据结构。
所以我想我可以实现一个全局数据存储,将所有数据保存在一些分组结构中。我也考虑过使用 SQLite 之类的东西,但我认为这对我的应用程序来说太过分了。
不过还有一些悬而未决的问题
- 为了保证线程安全,我假设我需要为我的读写访问添加一个信号量,但是...
- 如果线程只需要更新结构的某些元素,我需要将指向该结构的指针交给它,但是一旦我开始使用指针引用,我就无法再使用信号量保护我的访问。那么如何允许线程修改单个结构元素而不违反线程安全?
- 有没有比我计划使用的更好的方法来获得类似
global store
的东西? Google 没有给出太多提示。
我来分享一下处理此类场景最常见的C方式。
为了避免暴露大量全局数据,请使用 opaque pointer
s 并有一个 API 列表,这些 API 将不透明指针作为参数。通过这种方式,您可以拥有一组干净的 API 来访问所有结构,而将实现细节留在 .c 文件中。使用 opaque pointers 的好处是没有人知道如何处理指向数据的类型,除了接受 opaque 指针作为参数的 API。这为您的结构提供了保护和封装,以便您可以使用您提供的 API 访问或更改它们。
在每个由不透明指针标识的结构定义中,有一个mutex
(FreeRTOS 已经根据信号量 实现了互斥锁)来访问结构成员以线程安全的方式。创建互斥量时必须使用 xSemaphoreCreateMutex
。在您的所有 API 中,当您想要访问可能被多个任务访问的成员数据时,请使用 xSemaphoreGive
& xSemaphoreTake
。
我正在 FreeRTOS 上编写应用程序 运行,其中我有不同的线程,它们都必须访问(读取和写入)相同的数据结构。 所以我想我可以实现一个全局数据存储,将所有数据保存在一些分组结构中。我也考虑过使用 SQLite 之类的东西,但我认为这对我的应用程序来说太过分了。
不过还有一些悬而未决的问题
- 为了保证线程安全,我假设我需要为我的读写访问添加一个信号量,但是...
- 如果线程只需要更新结构的某些元素,我需要将指向该结构的指针交给它,但是一旦我开始使用指针引用,我就无法再使用信号量保护我的访问。那么如何允许线程修改单个结构元素而不违反线程安全?
- 有没有比我计划使用的更好的方法来获得类似
global store
的东西? Google 没有给出太多提示。
我来分享一下处理此类场景最常见的C方式。
为了避免暴露大量全局数据,请使用 opaque pointer
s 并有一个 API 列表,这些 API 将不透明指针作为参数。通过这种方式,您可以拥有一组干净的 API 来访问所有结构,而将实现细节留在 .c 文件中。使用 opaque pointers 的好处是没有人知道如何处理指向数据的类型,除了接受 opaque 指针作为参数的 API。这为您的结构提供了保护和封装,以便您可以使用您提供的 API 访问或更改它们。
在每个由不透明指针标识的结构定义中,有一个mutex
(FreeRTOS 已经根据信号量 实现了互斥锁)来访问结构成员以线程安全的方式。创建互斥量时必须使用 xSemaphoreCreateMutex
。在您的所有 API 中,当您想要访问可能被多个任务访问的成员数据时,请使用 xSemaphoreGive
& xSemaphoreTake
。