#c #macos #boost #mutex #boost-interprocess
#c #macos #boost #мьютекс #boost-межпроцессный
Вопрос:
У меня есть некоторый код, который ожидает операции записи в разделяемую память. Если никто не пишет, он продолжает ждать.
Test* Foo::Get()
{
boost::interprocess::scoped_lock<boost::interprocess::interprocess_mutex> lock ( mutex ) ; // mutex is boost::interprocess::interprocess_mutex
if ( this->check == 0 )
this->interprocessCondition.wait ( lock ) ; // interprocessCondition is boost::interprocess::interprocess_condition
...
}
Когда я делал выборку, я обнаружил, что он потребляет около 90% ЦП.
Может ли кто-нибудь помочь мне решить эту проблему с производительностью? Пожалуйста, посмотрите прикрепленное изображение.
Комментарии:
1. Вы делаете что-нибудь еще или просто профилируете блокировку? Как выглядит код «что-то еще»?
2. Это просто чтение из общей памяти в somethingelse. Я профилировал полный исполняемый файл.
3. Это не очень помогает. Обычно для снятия блокировки требуется намного больше ЦП, чем для чтения int из общей памяти. Вы решаете эту проблему, делая блокировку менее мелкозернистой.
4. Больше отладочных указаний на
inline void sched_yield()
то, что для Windows он вызывает Sleep (1), но я не могу найти какое-либо определение для Mac?5. Что означает 90% CPU? Создает ли это цикл занятости на некоторое время или фактически уступает другому процессу?
Ответ №1:
boost::interprocess
к сожалению, на многих платформах (по-видимому, включая OSX) используются блокировки с ожиданием занятости. Вы захотите использовать блокировку, встроенную в вашу платформу, которая на самом деле спит.
Комментарии:
1. Или, к счастью, это зависит от того, чего вы хотите достичь.
2. Я добавил sleep(1) вместо sched_yield(); вызов? Теперь это очень приятно. Будет ли это иметь какие-либо побочные эффекты, кроме того, что я должен следить за обновлением boost, не нарушающим код?
3. @MacGeek, это значительно увеличит задержку пробуждения
4. Но Boost использует sleep (1) для Windows? Разве эффект не должен быть таким же?
5. @MacGeek в OS X
sleep(1)
ожидает одну секунду. В WindowsSleep(1)
ожидает одну миллисекунду .