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.