Ho una funzione time-critical che deve essere eseguita più volte in modo sequenziale.
void task(state_t *state);
Utilizza una quantità relativamente grande di memoria, quindi ho pensato che allocarlo una volta all'inizio e liberarlo alla fine velocizzasse la sequenza di attività.
state_t *state = alloc_state();
task(state);
task(state);
task(state);
free_state(state);
Ma la memoria deve essere resettata (tutta la memoria impostata su 0) tra le attività, che è tanto lenta quanto la sua allocazione. Poiché l'utilizzo della memoria non è critico, ho pensato di poter duplicare lo stato del programma e utilizzare un thread per ripristinarne uno quando l'altro è in uso.
state_t *state_a = alloc_state();
state_t *state_b = alloc_state();
pthread_t thread1, thread2;
while (1) {
/* running task on state_a */
pthread_create(&thread1, NULL, task, (void*) state_a);
pthread_create(&thread2, NULL, reset_state, (void*) state_b);
pthread_join(thread1, NULL);
pthread_join(thread2, NULL);
/* running task on state_b */
pthread_create(&thread1, NULL, task, (void*) state_b);
pthread_create(&thread2, NULL, reset_state, (void*) state_a);
pthread_join(thread1, NULL);
pthread_join(thread2, NULL);
}
free_state(state_a);
free_state(state_b);
Funziona bene, ma lo trovo inelegante. Va bene fare questo? C'è una soluzione più elegante? Inoltre, anche se la memoria non è critica, esiste una soluzione senza il compromesso della memoria di tempo?