簡體   English   中英

在C中創建線程安全的全局存儲

[英]Create thread safe global store in C

我正在寫一個在FreeRTOS上運行的應用程序,其中我有不同的線程,所有線程都必須訪問(讀和寫)相同的數據結構。 因此,我認為我可以實現一個全局數據存儲,以某些分組的結構保存所有數據。 我還考慮過使用SQLite之類的東西,但是我認為這對我的應用程序來說是一個過大的殺傷力。

盡管如此,仍有一些懸而未決的問題

  1. 為了保證線程安全,我假設我需要為我的讀寫訪問權限添加一個信號燈,但是...
  2. 如果線程僅需要更新結構的某些元素,則需要將其傳遞給該結構的指針,但是一旦我開始使用指針引用,我就無法再通過信號量來保護訪問。 那么,如何允許線程修改單個結構元素而不破壞線程安全性?
  3. 是否有比我計划使用的global store更好的方式來global store Google沒有給出太多提示。

讓我與您分享處理這種情況的最常見的C方法。

為了避免公開大量全局數據,請使用opaque pointer s,並使用以opaque指針作為參數的API列表。 這樣,您可以擁有一組干凈的API來訪問所有結構,而將實現細節保留在.c文件中。 使用不透明指針 s的好處是,除了將不透明指針作為參數的API之外,沒人知道如何處理指向數據的類型。 這為您的結構提供了保護和封裝,以便您使用提供的API對其進行訪問或更改。

在由不透明指針標識的每個結構定義中,都有一個mutexFreeRTOS具有在信號量的術語中實現的互斥鎖 )以線程安全的方式訪問結構成員。 創建互斥鎖時,必須使用xSemaphoreCreateMutex 當您要訪問可能由多個任務訪問的成員數據時,在所有API中都使用xSemaphoreGivexSemaphoreTake

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM