Il mio no era riferito solo al Singleton, non a tutto il resto. Se esiste una funzione di creazione dei cataloghi, puoi e devi gestire il puntatore tramite uno shared_ptr.

In questo caso come il progetto accede alle risorse condivise in ambito multithreading?
Le risorse condivise di solito sono variabili globali o risorse del sistema (un file ad esempio), l'importante è fare in modo che solo un thread alla volta ci accedam altrimenti si ha una race condition.
Ci pensa il sistema operativo che gestisce i thread?
No, ci devi pensare tu.

Delle TBB ho usato solo la tbbmalloc.dll per avere le funzioni di gestione della memoria e creare un allocatore compatibile con STL. Tuttavia (da quel che so) i thread in TBB stanno dietro le quinte, non si gestiscono direttamente.
Boost ha la libreria che è stata adottata dal nuovo standard C++ e che prima o poi tutti i compilatori implementeranno.

Libri e documentazione sparsa ce n'è ma non so se sono a livello principiante.
http://oreilly.com/catalog/multithre...erpt/ch01.html
http://docs.sun.com/app/docs/doc/816-5137
http://en.wikipedia.org/wiki/Thread_...ter_science%29

Puoi cercare con multithreading programming, race condition, deadlock, mutex; materiale ne salta fuori.