Проблема в выборе контейнера для сокетов. У вектора есть особенность, он распределяет все свои элементы последовательно в памяти и заранее выделяет под них память. В какой-то момент, при
добавлении элемента, к примеру, он может изменить расположение этого последовательного участка в памяти. И получается что в своих потоках вы ссылаетесь на память в которой сокеты уже не находятся. std::vector::reserve лишь временное откладываение проблемы, которая покажет себя при большем кол-ве подключений.
Следует задуматься о замене вектора на
std::list , к примеру, который не имеет данной особенности.