Semaforizzazione e barriere di esecuzione dei thread

$_lock

la macro  $_lock funziona quindi come una barriera che non viene superata fino a quando il mutex è in stato lock; appena sbloccato dall’utente che ne aveva il possesso, il mutex verrà bloccato nuovamente verso gli altri utenti, fino a termine esecuzione del blocco di codice.

$_wait_unlock(mtx)

Questa macro definisce una barriera all’esecuzione del codice, fino a quando il mutex non viene sbloccato da chi ne ha preso il possesso; Contrariamente alla $_lock essa non comporta il blocco del mutex nel codice che la usa, poichè, come si può vedere dalla definizione, la lock_guard assegnata è definita all’interno di un blocco di codice {..} che termina l’esecuzione con lo sblocco stesso del mutex:

#define $_wait_unlock(_mutex) {$_lock(_mutex)}

In altri termini: $_wait_unlock attende che il mutex venga sbloccato, e prosegue con l’esecuzione del codice senza bloccarlo nuovamente.

$_wait_mutex(mtx)

La macro è simile alla __wait_unlock,  ma l’attesa dello sblocco del mutex è effettuata da una specifica funzione thread, $_wait_mutex, non in un blocco di codice:

#define $_wait_mutex(mtx)  $_thread t(wait_mutex, &(mtx)); t.join(); 

Come si osserva, la macro definisce un thread t, definito $_wait_mutex, gli passa un mutex, quindi (t.join()) attende la terminazione del thread; La funzione $_wait_mutex è la seguente:

static void $:wait_mutex(_mutex_ptr mtx) { $_lock(*mtx); }

$_get_max_threads(_nth)

La macro dichiara la costante _nth inizializzandola con il numero di thread disponibili per l’hardware in uso:

  #define $_get_max_threads(_nth)  unsigned long const _nth= std::thread::hardware_concurrency();

Per farlo la macro richiama la funzione std::thread::hardware_concurrency() che fornisce l’informazione.

Pages: 1 2 3 4
Skip to toolbar