Я не нахожу, что переменная условия ни надстройки, ни надстройки библиотеки tbb имеет интерфейс для работы с блокировкой чтения-записи (т. Е. Разделяемый мьютекс в надстройке). condition_variable :: wait () принимает только блокировку мьютекса. Но я думаю, что вполне разумно, чтобы это работало с блокировкой читатель-писатель. Может кто-нибудь сказать мне причину, почему они не поддерживают это, или почему люди не делают этого?
Спасибо,
Цуй
Нативный API потоков базовой платформы может не поддерживать его легко. Например, на платформе POSIX, где переменная условия реализована в терминах pthread_cond_t
может использоваться только с pthread_mutex_t
, Чтобы получить максимальную производительность, базовый тип переменной условия представляет собой облегченную оболочку над нативными типами без дополнительных затрат.
Если вы хотите использовать другие типы мьютекса, вы должны использовать std::condition_variable_any
или же boost::condition_variable_any
, которые работают с любым типом мьютекса. Это имеет небольшие дополнительные издержки из-за использования внутреннего мьютекса типа нативной платформы в дополнение к предоставленному пользователем мьютексу. (Я не знаю, предлагает ли TBB эквивалентный тип.)
Это компромисс между дизайном, который обеспечивает производительность или гибкость. Если вы хотите максимальной производительности, вы получите его с condition_variable
но можно использовать только простые мьютексы. Если вы хотите больше гибкости, вы можете получить это с condition_variable_any
но вы должны пожертвовать небольшой работой.
Других решений пока нет …