2010-02-26 2 views
2

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

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

Итак, мой запрос заключается в том, как я могу получить на уровне производительности или как уменьшить использование мьютексов?

Надеюсь, мой вопрос ясен, дайте мне знать. Я постараюсь быть более ясным.

+1

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

+0

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

+0

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

ответ

4

Если вы используете Windows и синхронизация нужна только в вашем приложении, используйте CriticalSection. Это намного быстрее, чем Mutex.

+1

+1: хороший ответ. Обратите внимание, что критические разделы являются стандартной функцией системного программирования.Он существует для всех ОС (ну, может быть, не для операционной системы Lisp?). Статьи в Википедии - хорошее введение: http://en.wikipedia.org/wiki/Critical_section –

0

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

1

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

Предполагая, что:

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

вы можете изучить специфичные для ОС функции, такие как атомные приращения и декременты без мьютекса. Они не будут переносимыми C, но вы можете использовать определения для целевых функций ОС (Interlocked* для Windows и GCC __sync_* звонки - вот где я буду искать в первую очередь).

+0

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

0

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

3

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

0

Замените некоторые из ваших изменяемых структур данных, разделяемых между потоками с неизменяемыми версиями. Неизменяемые структуры данных всегда надежны в потоке. (Изменить его вы создаете новую копию.) Это в основном торгует скоростью для упрощения кода.

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