Методы избавления от низкоуровневой блокировки

Мне интересно, и мне нужны стратегии, которые можно применить для уменьшения низкоуровневой блокировки. Однако загвоздка здесь в том, что это не новый код (с десятками тысяч строк кода C++) для серверного приложения, поэтому я не могу просто переписать его целиком.

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

Сейчас слишком много блокировок и не так много конфликтов, так что это проблема производительности оборудования, вызванная паранойей. Лучший способ описать код — это как однопоточный код, внезапно начиненный блокировками.


person Robert Gould    schedule 24.09.2008    source источник
comment
Является ли проблема тратой ЦП на расточительное получение и снятие блокировок или проблема связана с чрезмерным соперничеством за некоторые блокировки?   -  person Don Neufeld    schedule 24.09.2008
comment
низкий уровень? Как в крупнозернистом?   -  person svrist    schedule 24.09.2008
comment
это настольное приложение или веб-решение? зачем все эти замки?   -  person Sklivvz    schedule 24.09.2008


Ответы (3)


Зачем нужно устранять низкоуровневую блокировку? У вас есть проблемы с тупиком? У вас есть проблемы с производительностью? Или проблемы с масштабированием? Являются ли блокировки обычно оспариваемыми или не оспариваемыми?

Какую среду вы используете? Например, ответы на C++ будут отличаться от ответов на Java. Например. неоспариваемые блоки синхронизации в Java 6 на самом деле относительно дешевы с точки зрения производительности, поэтому простое обновление JRE может решить любую проблему, которую вы пытаетесь решить. Аналогичные улучшения производительности могут быть доступны в C++ при переключении на другой компилятор или библиотеку блокировки.

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

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

Во-вторых, все неизменяемое безопасно, если оно «безопасно опубликовано» (то есть создано таким образом, что частично сконструированный объект никогда не виден другому потоку).

В-третьих, большинство платформ теперь поддерживают атомарную запись, что может помочь, когда требуется защитить только один примитивный тип (включая указатель). Они работают очень похоже на оптимистическую блокировку в базе данных. Вы также можете использовать атомарную запись для создания алгоритмов без блокировок для замены более сложных типов, включая реализации Map. Однако, если вы не очень-очень хороши, вам гораздо лучше позаимствовать чью-нибудь отлаженную реализацию (пакет java.util.concurrent содержит множество хороших примеров) — общеизвестно, что при написании собственных алгоритмов легко случайно внести ошибки.

В-четвертых, может помочь расширение области действия мьютекса — либо просто держать мьютекс открытым дольше, чем постоянно блокировать и разблокировать его, либо блокировать «больший» элемент — например, объект, а не одно из его свойств. . Однако делать это нужно крайне осторожно; вы можете легко ввести проблемы таким образом.

person Bill Michell    schedule 24.09.2008

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

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

person Community    schedule 24.09.2008

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

person moonshadow    schedule 24.09.2008