синхронизация многопоточности c

#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] раз, было бы достаточно — с семафором не требуется массив, в отличие от событий.