Как управлять несколькими экземплярами одного и того же потока для обработки последовательного списка - PullRequest
0 голосов
/ 10 октября 2019

У меня есть связанный список, который будет обработан n экземплярами того же pthread .

Поток будет непрерывно удалять элемент из списка и, в зависимости от типа, будет перемещать его во второй список, присваивая ему последовательный ссылочный номер, который генерируется функцией. Номера должны быть назначены в той же последовательности, как элементы удалены из списка.

Буду признателен за некоторые идеи, как это сделать. Проблема заключается в том, что потоки присваивают не по порядку ссылочные номера элементам, удаленным из списка. Пожалуйста, рассмотрите список, содержащий A1, A2, A3. Поток n1 удаляет A1, получает ссылочный номер 1 и связывает его с элементом A1. Нить n2 удаляет элемент A2, а нить n3 удаляет элемент A3;перед нитью n2 можно получить ссылочный номер 2, нить n3 уже получила его и, следовательно, когда нить n2 получает ссылочный номер, это будет ссылочный номер 3.

Результат: {{A1, 1}, {A2, 3}, {A3, 2}}, что неверно. Я попытался использовать условную переменную, но единственный способ, который имеет для меня смысл, - это вызвать pthread_cond_broadcast () перед вызовом pthread_cond_wait () , что, очевидно, нелогично, идеячто-то вроде не позволяйте никаким нитям получать элемент из списка, пока не будет обработан последний элемент . Я реализовал версию, которая пропускает pthread_cond_signal (), если запускается самый первый поток, а затем запускает pthread_cond_wait (), пока второй поток не запустит pthread_cond_broadcast ();это работает лучше, чем без условной переменной, но результаты не постоянны. Иногда отлично подойдет для 2 или 3 потоков, иногда для 2 или 4, но, очевидно, это не работает. Я также использовал переменную мьютекса, но не смог достичь цели.

Спасибо.

...