Я понимаю, почему он не работает так, как вы ожидаете. Ваша серверная сторона использует уникальный идентификатор, переданный из main, чтобы определить, каким должен быть ее идентификатор потока, но сама функция потока использует идентификатор потока.
Первый созданный вами рабочий поток завершается, а второй создается с тем же идентификатором, что и первый, поскольку этот идентификатор теперь доступен.
Основной поток помещает строку в очередь второго элемента вектора, но ваш поток выбирает первый элемент вектора, потому что у него совпадает идентификатор потока.
Кстати, все, что они говорили в предыдущих постерах, тоже следует учитывать. Просто это не те, которые производят ваше поведение.
void* printHello(void* serverptr)
{
serverInfo * info = static_cast< serverInfo * >(serverptr);
// look through the queue
}
Измените тип коллекции на std::list
или std::deque
, чтобы он не делал недействительным указатель, если вы впоследствии сделаете push_back во время его обработки потоком.
В checkServerExists
передайте адрес serverInfo в функцию потока, а не адрес идентификатора потока.
Вы также можете «проиндексировать» вашу коллекцию с помощью карты из int в serverInfo * или в итератор списка, если вы используете список. Вы не должны использовать std::map<int, serverInfo>
, потому что это может сделать ваши указатели недействительными, если вы добавите новые записи на карту.
Кстати, ваш рабочий поток завершается слишком рано, потому что когда вы отправляете более позднюю информацию на старые идентификаторы, потоки уже исчезли.
Пустая очередь не должна быть условием завершения потока, и вы должны использовать другие средства.
Между прочим, хотя он является поточно-ориентированным, ваш мьютекс заблокирован так долго, что вы не сможете достичь приличной производительности при использовании нескольких потоков здесь.