Почему блокировка может стать узким местом многопоточной программы? - PullRequest
1 голос
/ 09 июня 2009

Почему блокировка может стать узким местом многопоточной программы?

Если я хочу, чтобы моя очередь часто выполнялась pop () и push () по многопоточности,

какой замок мне использовать?

Ответы [ 6 ]

3 голосов
/ 09 июня 2009

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

Блокировки становятся узким местом в вашей программе, когда они находятся в состоянии сильной конкуренции. То есть все очень большое количество потоков пытаются получить блокировку одновременно. Это приводит к напрасной потере циклов ЦП, поскольку потоки блокируются, и ОС тратит все большую часть своего времени на переключение между потоками. Такая проблема чаще всего проявляется в мире серверов. Для настольных приложений редко, когда блокировки вызывают проблемы с производительностью.

2 голосов
/ 09 июня 2009

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

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

1 голос
/ 09 июня 2009

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

Предлагаем вам прочитать эту статью на тему «Параллельность: что каждый разработчик должен знать о многопоточных приложениях» http://msdn.microsoft.com/en-au/magazine/cc163744.aspx

1 голос
/ 09 июня 2009

Для очереди легко написать реализацию без блокировки (google away)

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

0 голосов
/ 09 июня 2009

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

0 голосов
/ 09 июня 2009

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

Как программист, лучше оставить экспертам блокировки в середине ваших структур данных и вместо этого использовать хорошую многопоточную библиотеку , такую ​​как TBB

от Intel

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...