Una delle librerie più conosciute di threading C++, Intel ® Threading Building Blocks (Intel® TBB), è stata recentemente aggiornata a una nuova versione, la 4.2. Rispetto alla precedente versione 4.1, la versione aggiornata contiene diverse nuove importanti funzionalità, alcune delle quali erano già state rilasciate negli aggiornamenti di Intel TBB 4.1.
La nuova primitiva di sincronizzazione speculative_spin_mutex introduce il supporto per il blocco speculativo. Ciò è reso possibile usando la funzione hardware Intel® Transactional Synchronization Extensions (Intel® TSX) disponibile nei processori Intel® Core™ di quarta generazione. Sui processori che supportano la memoria transazionale hardware (come Intel® TSX), i mutex speculativi lasciano che più thread acquisiscano lo stesso blocco, a condizione che non ci siano "conflitti" che possono generare risultati diversi rispetto al blocco non speculativo. Quindi la serializzazione non avviene nei casi non contesi. Ciò consente di migliorare significativamente le prestazioni e la scalabilità di "brevi" sezioni critiche. Se il supporto hardware per la sincronizzazione transazionale non è presente, i mutex speculativi si comportano come le loro controparti non speculative, ma probabilmente con prestazioni peggiori.
Intel TBB supporta ora la funzione di propagazione esatta delle eccezioni (basata su C++11 exception_ptr). Con exception_ptr, gli oggetti eccezione possono essere copiati in modo sicuro tra i thread. In questo modo viene introdotta flessibilità nella gestione delle eccezioni in un ambiente multithreading. La propagazione esatta delle eccezioni è disponibile in file binari precompilati per tutte le piattaforme: OS X*, Windows* e Linux*. In OS X ci sono due gruppi di binari: il primo, che è collegato con la libreria standard gcc, è utilizzato per impostazione predefinita e non supporta la propagazione esatta delle eccezioni. Per utilizzare la funzione, si deve prendere il secondo gruppo di binari collegati con libc++, la libreria C++ standard in Clang. Per utilizzarli, impostare l'ambiente di Intel TBB e compilare l'applicazione nel modo seguente:
# tbbvars.sh libc++
# clang++ -stdlib=libc++ -std=c++11 concurrent_code.cpp -ltbb
Oltre ai contenitori concurrent_unordered_set e concurrent_unordered_map, ora forniamo concurrent_unordered_multiset e concurrent_unordered_multimap basati sul prototipo Microsoft* PPL. concurrent_unordered_multiset offre la possibilità di inserire un elemento più di una volta, cosa non possibile in concurrent_unordered_set. Allo stesso modo, concurrent_unordered_multimap permette di inserire più di una coppia <chiave,valore> con lo stesso valore di chiave. Per entrambi i "multi" contenitori find restituirà la prima voce (o coppia <chiave,valore>) nella tabella con una chiave di ricerca corrispondente.
I contenitori Intel TBB ora possono essere comodamente inizializzati con gli elenchi di valori specificati da C++ 11 (elenchi di inizializzatori):
tbb::concurrent_vector<int> v ({1,2,3,4,5} );
Attualmente gli elenchi di inizializzazione sono supportati dai seguenti contenitori:
concurrent_vector concurrent_hash_map concurrent_unordered_set concurrent_unordered_multiset concurrent_unordered_map concurrent_unordered_multimap concurrent_priority_queue
L'allocatore di memoria scalabile ha cache di memoria allocata in ogni thread. Ciò viene fatto per motivi di prestazioni, ma spesso a costo di un maggiore utilizzo della memoria. Anche se l'allocatore di memoria fa il possibile per evitare un utilizzo eccessivo della memoria, nei casi complessi Intel TBB 4.2 dà più controllo al programmatore: è ora possibile ridurre il consumo di memoria pulendo le cache dei thread con la funzione scalable_allocation_command(). Erano anche presenti diversi miglioramenti nelle prestazioni complessive dell'allocatore.
La libreria Intel TBB è ampiamente utilizzata su diverse piattaforme. Gli sviluppatori di applicazioni mobili possono ora trovare i file binari precompilati per Android nel pacchetto del sistema operativo Linux. I file binari per le applicazioni Windows Store sono stati aggiunti al pacchetto del sistema operativo Windows.
Le variabili atomiche tbb::atomic<T> hanno ora i costruttori se usate in C++11. Ciò consente ai programmatori di inizializzare il loro valore al momento della dichiarazione, con le espressioni const adeguatamente supportate. Attualmente questo funziona per i compilatori gcc e Clang:
tbb::atomic<int> v=5;
La nuova funzione Community Preview consente l'attesa fino a quando tutti i thread di lavoro terminano. Questo potrebbe essere necessario se un'applicazione biforca i processi o se la libreria dinamica Intel TBB può essere scaricata in fase di esecuzione (ad esempio, se Intel TBB fa parte di un plugin). Per attivare l'attesa dei thread di lavoro, inizializzare l'oggetto task_scheduler_init in questo modo:
#define TBB_PREVIEW_WAITING_FOR_WORKERS 1 tbb::task_scheduler_init scheduler_obj (threads, 0, /*wait_workers=*/true);
Potete trovare il nuovo Intel TBB 4.2 nei siti commerciali e open source. Scaricate e divertitevi con la nuova funzionalità!