Po pierwsze (czego nie jestem pewien z Twojego kodu), nie traktuj neuronu jako obiektu. To podejście spowoduje bardzo szybkie osiągnięcie sufitu wydajności. Traktuj wszystkie wagi danej warstwy jako macierze które mnożysz (bo wynik dla danego neuronu to "dot product"). I to jest zadanie dla potencjalnych wątków.
Po drugie, wydajność wątków bardzo silnie zależy od % trafialności w cache (tu nie będę rozwijał którego poziomu L* i jaka jest architektura systemu). Ogólnie nie opłaca się zlecania wątkom "małych prac", bo będą "szamotały" się z innymi o zasoby w cache i dojdzie do zjawiska fałszywego współdzielenia (ang. false sharing). Tak więc tylko macierze które wypełniają w wystarczającym stopniu cache, opłaca się zlecać do wątku.
Po trzecie, jeśli już chcesz tworzyć wątki zgodnie ze wzorcem puli wątków (ang. thread pool), powinieneś opanować pojęcia związane ze zmiennymi decyzyjnymi (ang. condition variable), oraz spakowanego zadania (ang. packaged task). Bez tych pojęć będzie Ci trudno zaimplementować pulę w C++.
Po czwarte, dobrze jest mieć świadomość, że dziś tego typu rzeczy (macierze, AI), liczy się raczej na kartach graficznych. Niemniej jednak jeśli traktujesz Twój pomysł jako ćwiczenie, jest najbardziej ok. Tylko "nie ostrz sobie zębów" na ekstremalną wydajność :)
Klika linków, wraz z przykładami do poczytania:
https://en.cppreference.com/w/cpp/thread/packaged_task
https://en.cppreference.com/w/cpp/thread/condition_variable
https://www.codeproject.com/Articles/3607/Work-Queue
https://en.wikipedia.org/wiki/Thread_pool