Ждите многократных нитей (нити Posix, C++)

Рассмотрите следующую ситуацию:

У меня есть объект foo, который используется многократными нитями, которые могут или могут не неоднократно называть бар метода() на foo.

Это прекрасно подходит (и желаемый), что бар() выполняется многократно параллельно, поскольку это никогда не изменяет государство foo.

Проблема возникает, когда я должен изменить государство foo с внешней стороны (от другой нити, не от одной из нитей "рабочего") - как я могу захватить foo способом так, чтобы блоки вызывающего потока до последнего рабочего потока были сделаны с баром (), и все рабочие потоки заблокируют в баре (), пока я не выпущу foo снова?

Очевидно, я не могу только использовать mutex, который является, остается запертым во время казни бара (), потому что тогда у меня не будет параллелизма там.

Какие-либо идеи? Или есть ли лучший дизайн для тех типов проблем?

6
nl ja de
добавлено автор hmjd, источник
pthread_rwlock_t может представлять интерес для вас.
добавлено автор WhozCraig, источник
pthread_rwlock_t может представлять интерес для вас.
добавлено автор WhozCraig, источник
что относительно барьера?
добавлено автор PlasmaHH, источник
что относительно барьера?
добавлено автор PlasmaHH, источник
почему не представление mutex в рабочих потоках вокруг запроса бара функционирует и на также на вызывающем потоке, который хочет изменить государство foos. вызывающий поток захватывает mutex, и может, чем безопасно изменение foo' s государство.
добавлено автор mgr, источник
почему не представление mutex в рабочих потоках вокруг запроса бара функционирует и на также на вызывающем потоке, который хочет изменить государство foos. вызывающий поток захватывает mutex, и может, чем безопасно изменение foo' s государство.
добавлено автор mgr, источник

2 ответы

Я не уверен, как вы собираетесь достигнуть, что ни один из , рабочие используют foo, чтобы позволить писателю , не обновляет его, но если это не имеет беспокойства, тогда просто используют a чтение-запись mutex ( рабочие , чтобы получить прочитанный замок, писатель , чтобы получить пишут замок).

Это стоит упомянуть, хотя, что вы могли бы хотеть рассмотреть создание foo Copy-Write. Таким образом, вы сделаете синхронизацию наверху близко к нолю. Можно использовать shared_ptr атомарно достигнуть этого.

4
добавлено
Благодаря всем указателям на pthread_rwlock_t!
добавлено автор Pontomedon, источник

Я не уверен, как вы собираетесь достигнуть, что ни один из , рабочие используют foo, чтобы позволить писателю , не обновляет его, но если это не имеет беспокойства, тогда просто используют a чтение-запись mutex ( рабочие , чтобы получить прочитанный замок, писатель , чтобы получить пишут замок).

Это стоит упомянуть, хотя, что вы могли бы хотеть рассмотреть создание foo Copy-Write. Таким образом, вы сделаете синхронизацию наверху близко к нолю. Можно использовать shared_ptr атомарно достигнуть этого.

4
добавлено
Благодаря всем указателям на pthread_rwlock_t!
добавлено автор Pontomedon, источник
pro.cxx
pro.cxx
3 049 участник(ов)

C/C++ chat 0. Простые вопросы, лабы и о IDE — в чат новичков @supapro 1. Не хамим, не переходим на личности, не вбрасываем утверждения без доказательств 2. No Ads, offtop, flood Объявления о вакансиях и евенты - в лс @AlexFails https://t.me/ProCxx/259155

supapro.cxx
supapro.cxx
1 925 участник(ов)

Чат для тех, кто немного знает C++, простые вопросы по реализации, синтаксису и ide – сюда, а для другого есть: /Главный чат по серьезным вопросам — @ProCxx /Чат по обсуждению всего — @fludpac

C++ Russia
C++ Russia
384 участник(ов)

Сообщество разработчиков C++ в Telegram.

cxx.Дискуссионная
cxx.Дискуссионная
298 участник(ов)

это не двач, общайтесь вежливо; разговор на почти любые темы; Не согласны с баном? В лс @AlexFails, @ivario

C++ для маленьких и тупых
C++ для маленьких и тупых
105 участник(ов)

Лоу левел (по среднему IQ участников) чатик ExtremeCode @extremecode Флудилка @extremecode_rest