С opengroup.org на pthread_join :
Результаты нескольких одновременных вызовов pthread_join (), указывающих один и тот же целевой поток, не определены.
Таким образом, у вас не должно быть нескольких потоков, присоединяющихся к вашему предыдущему insertThread.
Во-первых, когда вы используете C ++, я рекомендую boost.thread . Они напоминают модель потоков POSIX, а также работают на Windows. И это помогает вам в C ++, то есть облегчает использование функциональных объектов.
Во-вторых, почему вы хотите начать новый поток для вставки элемента, когда вам всегда нужно ждать завершения предыдущего, прежде чем начинать следующий? Кажется, не классическое использование многопоточности.
Хотя ... Одним из классических решений этого было бы иметь один рабочий поток, получающий задания из очереди событий, а другие потоки отправляют операцию в очередь событий.
Если вы действительно хотите сохранить его более или менее таким же образом, как сейчас, вы должны сделать это:
- Создайте условную переменную, например
insert_finished
.
- Все потоки, которые хотят выполнить вставку, ждут переменную условия.
- Как только один поток завершает свою вставку, он запускает переменную условия.
- Поскольку условная переменная требует мьютекса, вы можете просто уведомить все ожидающие потоки, все они хотят начать вставку, но поскольку только один поток может получить мьютекс одновременно, все потоки будут выполнять вставку последовательно.
Но вы должны позаботиться о том, чтобы ваша синхронизация не была реализована слишком специально. Так как это называется insert
, я подозреваю, что вы хотите манипулировать структурой данных, поэтому вы, вероятно, захотите сначала реализовать потокобезопасную структуру данных вместо того, чтобы делиться синхронизацией между доступом к структуре данных и всеми клиентами. Я также подозреваю, что будет больше операций, чем просто insert
, что потребует правильной синхронизации ...