2015-01-02 2 views
2

perlthrtut выдержка:Perl ithreads: общие переменные - многопроцессорные потоки ядра - видимость

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

Работа с Linux, поддерживающая многопроцессорные потоки ядра.

Есть ли гарантия, что все потоки будут видеть обновленное значение общей переменной? Консультирование клиента perlthrtut, как указано выше, не существует такой гарантии.

Теперь вопрос: что можно сделать программно, чтобы гарантировать это?

ответ

1

Вы спрашиваете

Есть ли гарантия, что все потоки будут видеть обновленное общее переменное значение?

Да. :shared - это гарантия. Значение будет безопасно, последовательно и свежее обновление.

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

Консультирование клиента, как указано выше, нет такой гарантии.

Вы недостаточно читали. :)

На следующем разделе в perlthrtut объясняет вид подводных камней сделать лица PERL нитей: гонки данных, который должен сказать, применение логических расы в отношении общих данных. Опять же, общие данные будут последовательными и свежими и невосприимчивы к коррупции из (более или менее) атомных perl-операций. Тем не менее, операции perl высокого уровня, которые вы выполняете на этих общих данных, - , а не, гарантированные как атомарные.Например, $shared_var++ может быть более чем одной атомной операцией.

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

0

Вы, кажется, смущены относительно того, что делает :shared. Это делает так, чтобы переменная делилась всеми потоками.

Переменная действительно гарантирует, что она имеет значение, независимо от того, какой поток обращается к ней. Это тавтология, поэтому ничего не поделаешь, чтобы программно гарантировать это.

+0

perlthrtut не подтверждает ваше заявление, для меня это скорее мнение – user2050516

1

:shared Использование на переменной вызывает все нити, чтобы ссылаться на него в же адрес физической памяти, так что это не имеет значения, какой процессор/ядро ​​/ гипер-нить они, случается, выполняется в. В perlthrtutразговоры гарантии относятся к условиям гонки, и, короче говоря, вам нужно учитывать, что общие переменные могут быть изменены любым потоком в любое время. Если это проблема, вам нужно будет использовать функции синхронизации (например, lock() и cond_wait()) для контроля доступа.

+0

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

+0

Perl создает отдельный поток для доступа к воротам для переменных, а затем использует связи для доступа к данным из других потоков. Когда вы видите другой адрес в общей переменной, это из галстука. Консистенция кэша действительно выходит за рамки perl и в области дизайна CPU/чипсета. Как программисты, следует с уверенностью предположить, что наша система совместима с MPS, нет? –

+0

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

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

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