#c #multithreading #thread-synchronization
#c #многопоточность #синхронизация потоков
Вопрос:
Вот упрощенная версия моей проблемы.
Существует N потоков, выполняющих следующие 3 инструкции в бесконечном цикле:
A -> B -> C -> A -> B -> C -> A -> B -> .......
Я хочу, чтобы все потоки выполняли инструкцию B одновременно, т. Е. выполнение B любым потоком должно начинаться только в том случае, если все потоки достигли B. Итак, если есть поток, который выполнил B -> C -> A, он должен подождать здесь, пока другие потоки также не будут готовы к выполнению B.
Если возможно, пожалуйста, дайте мне знать о переносимом решении, которое будет работать как на Windows, так и на MAC.
Комментарии:
1. Только вчера Бартош Милевский опубликовал свой видеосюжет о параллелизме C 11 Series: 9. Переменные условия . Я нашел это самым интересным в серии (я думаю, нет необходимости сначала просматривать другие)
Ответ №1:
Вам следует ознакомиться с библиотекой потоков Boost, особенно с разделом о переменных условий.
Комментарии:
1. Хотя это больше похоже на то, что вам нужен барьер
2. @MikeSeymour: Почему бы вам не добавить это в качестве ответа?
3. Спасибо, Майк, да, похоже, что барьер — это то, что мне нужно. Позвольте мне углубиться в ее детали и вернуться к ней на случай, если у меня возникнут проблемы. Еще раз спасибо!
Ответ №2:
Массив из N-1 семафоров и мьютекса? Все потоки получают мьютекс, включая счетчик, и, если меньше N, освобождают мьютекс и ожидают массив семафоров в [счетчик]. N-й поток обнаруживает, что счетчик равен N, передает сигналы всем семафорам, сбрасывает счетчик на 0, выполняет ‘B’, освобождает мьютекс и завершает работу. Другие потоки, когда они освобождены, также выполняют B, но не могут выполнить цикл и войти снова, пока N-й поток не выполнит ‘B’ и не освободит мьютекс.
Все многозадачные ОС имеют семафоры / мьютексы. Вы могли бы использовать событие, если оно доступно, вместо семафора.
Комментарии:
1. На самом деле, одного семафора, сигнализирующего [n-1] раз, было бы достаточно — с семафором не требуется массив, в отличие от событий.