Ho 2 set - input e output - di 70 variabili intere a 32 bit e 70 bool (140 vars del tutto). Questi devono essere accessibili e modificati da 3 thread. Qual è un modello di progettazione appropriato per facilitare l'accesso in lettura-scrittura sicuro a thread a ciascuna di queste 140 variabili senza bloccarle tutte in un unico mutex (che mi aspetto si tradurrà in prestazioni inadeguate)?
Alcuni dettagli sui requisiti di rendimento:
-
Il thread 1 ("CAN Serial Communication") riceve pacchetti da sensori hardware ogni 1ms che contengono il valore aggiornato per una delle 70 variabili condivise di input; il thread aggiorna la variabile con quel valore. Inoltre, ogni Thread 5ms deve fare una copia di tutte le 70 variabili di output.
-
Il thread 2 ("Controller") crea una copia di tutte le variabili di input ogni 10 ms, oltre a sovrascrivere tutte le variabili di output.
-
Il thread 3 ("GUI") esegue una copia di tutte le variabili di input e di output ogni 500ms.
-
Il sistema funziona su un ARM Cortex-A8 600Mhz.
Una soluzione è creare un blocco mutex per ognuna delle 140 variabili, ma questo sembra un trucco. Vorrei quindi avvolgere le variabili in una classe con 140 getter e setter, che sembra anche brutto.
Una nota a margine su std::atomic
:
L'altra alternativa è std::atomic
. Ma penso che sia una funzionalità avanzata e complicata, per esempio mi è stato detto su IRC che il seguente frammento di esempio non è thread-safe, nonostante l'aspetto intuitivo di come dovrebbe essere:
typedef struct MyStruct {
std::atomic<int> a;
std::atomic<int> b;
}
std::atomic<MyStruct> atomic_struct;
atomic_struct.a = 1;
atomic_struct.b = 2;
// Make a copy of 'atomic_struct'
Mystruct normal_struct;
normal_struct = atomic_struct;
// Edit the values of the copied struct and copy the changes back to the 'atomic_struct'.
normal_struct.a = 100;
normal_struct.b = 200;
atomic_struct = normal_struct;