2010-05-05 5 views
8

У меня есть большая древовидная структура, на которой работают несколько потоков одновременно. В идеале я хотел бы иметь индивидуальную блокировку мьютекса для каждой ячейки.Использование многих блокировок мьютексов

Я рассмотрел определение pthread_mutex_t в bits/pthreadtypes.h, и он довольно короткий, поэтому использование памяти не должно быть проблемой в моем случае.

Тем не менее, есть ли штраф за исполнение при использовании многих (скажем, нескольких тысяч) разных pthread_mutex_t s всего за 8 потоков?

+0

Несколько тысяч на одном дереве есть .. вид сомнительных .. но трудно сказать без фактического просмотра. Можете ли вы разместить достаточно кода, чтобы показать достаточно подробный пример того, что вы делаете? –

ответ

8

Если вы блокируете и разблокируете очень часто, может быть штраф, так как получение и освобождение блокировок занимает некоторое время и может занимать достаточное количество времени, если блокируются.

При использовании многих замков в такой структуре вы должны быть очень конкретными в отношении того, что блокирует замок, и убедитесь, что вы осторожны с тупиками AB-BA. Например, если вы изменяете структуру дерева во время операции блокировки, вам нужно будет заблокировать все узлы, которые будут изменены в последовательном порядке, и убедитесь, что потоки, работающие над потомками, не запутываются.

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

Ваш лучший выбор - это, вероятно, реализовать простую блокирующую структуру, а затем профилировать ее, а затем уточнить для повышения производительности, если это необходимо. Я не уверен, что вы делаете с деревом, но хорошим местом для начала может быть одна блокировка чтения-записи для всего дерева, если вы ожидаете, что прочитаете гораздо больше, чем вы обновите.

«Мы должны забыть о небольшой эффективности, скажем, около 97% времени: преждевременная оптимизация - это корень всего зла». - Donald Knuth

+1

+1 - Отличный ответ. –

0

Для правильной оценки необходимо указать ваши шаблоны блокировки/доступа. Если каждый поток будет удерживать только один или несколько замков за раз, и вероятность того, что любые два или более потока потребует одну и ту же блокировку в одно и то же время, будет низкой (либо случайный доступ, либо 8 участников в разных положениях на круговой траектории работая примерно с той же скоростью или другими более сложными вещами), тогда вы, главным образом, избегаете худшего случая, когда поток должен спать, чтобы получить блокировку (или в некоторых случаях должен заставить ОС участвовать, чтобы решить, кто победит), потому что у вас так несколько потоков и так много замков.

Если каждый поток может потребовать сотни или тысячи замков в любой момент, тогда все начнет меняться.

Я не буду касаться избегания тупика, потому что я ничего не знаю о контейнере, который вы используете, но вам нужно знать о необходимости избегать их.

 Смежные вопросы

  • Нет связанных вопросов^_^