Блокировка чтения-записи с условной переменной

Я не нахожу, что переменная условия ни надстройки, ни надстройки библиотеки tbb имеет интерфейс для работы с блокировкой чтения-записи (т. Е. Совместно используемый мьютекс в boost) condition_variable::wait() принимает только блокировку мьютекса. Но я думаю, что вполне разумно, чтобы это работало с блокировкой читатель-писатель. Может кто-нибудь сказать мне причину, почему они не поддерживают это, или почему люди не делают этого?

Спасибо, Цуй

1 ответ

Решение

Родной API-интерфейс многопоточной платформы может не поддерживать его легко. Например, на платформе POSIX, где переменная условия реализована в терминах pthread_cond_t может использоваться только с pthread_mutex_t, Чтобы получить максимальную производительность, базовый тип переменной условия представляет собой облегченную оболочку над нативными типами без дополнительных затрат.

Если вы хотите использовать другие типы мьютекса, вы должны использовать std::condition_variable_any или же boost::condition_variable_any, которые работают с любым типом мьютекса. Это имеет небольшие дополнительные издержки из-за использования внутреннего мьютекса типа нативной платформы в дополнение к предоставленному пользователем мьютексу. (Я не знаю, предлагает ли TBB эквивалентный тип.)

Это компромисс между дизайном, который обеспечивает производительность или гибкость. Если вы хотите максимальной производительности, вы получите его с condition_variable но можно использовать только простые мьютексы. Если вы хотите больше гибкости, вы можете получить это с condition_variable_any но вы должны пожертвовать небольшой работой.

Другие вопросы по тегам