Блокировка чтения-записи с условной переменной
Я не нахожу, что переменная условия ни надстройки, ни надстройки библиотеки 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
но вы должны пожертвовать небольшой работой.