Как определить ориентированный на многопотоковое исполнение?

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

Таким образом, как Вы объясняете Threadsafe кодировать кому-то плохо знакомому с поточной обработкой? Мои идеи для опций являются моментом:

  • Сделайте Вы используете список того, что делает код ориентированным на многопотоковое исполнение по сравнению с потоком небезопасный
  • Книжное определение
  • Полезная метафора
11
задан Robert MacLean 4 January 2010 в 12:00
поделиться

8 ответов

Эрик Липперт говорит :

Когда меня спрашивают " безопасен ли этот код нити ?" Мне всегда приходится отступать и спрашивать ", какие именно сценарии потоков вас волнуют?" и ", что именно является правильным поведением объекта в каждом из этих сценариев?".

Невозможно сказать, что код "thread safe", не сообщив каким-то образом о том, какое нежелательное поведение делают и не предотвращают используемые нитевые механизмы безопасности.

12
ответ дан 3 December 2019 в 02:01
поделиться

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

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

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

Это означает, что независимо от того, как именно выполняются потоки, поведение всегда четко определено (и, следовательно, не зависит от условий гонки ).

.
14
ответ дан 3 December 2019 в 02:01
поделиться

i может быть, это и неправильно, но одним из критериев потоковой безопасности является использование только локальных переменных. Использование глобальных переменных может иметь неопределенный результат, если одна и та же функция вызывается из разных потоков.

.
3
ответ дан 3 December 2019 в 02:01
поделиться

Я бы сказал, чтобы понять thread safe, начните с понимания разницы между thread safe функцией и reentrant функцией.

Пожалуйста, проверьте Разницу между thread-safety и reentrancy для подробностей.

.
1
ответ дан 3 December 2019 в 02:01
поделиться

G'day,

Хорошее место для начала - чтение POSIX-бумаги по безопасности резьбы .

Правка: Только первые несколько абзацев дают краткий обзор по безопасности потока и код повторного ввода.

HTH

cheers,

3
ответ дан 3 December 2019 в 02:01
поделиться

Потокобезопасная функция/объект (далее - объект) - это объект, который предназначен для поддержки нескольких одновременных вызовов. Это может быть достигнуто сериализацией параллельных запросов или какой-то поддержкой переплетенных вызовов.

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

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

2
ответ дан 3 December 2019 в 02:01
поделиться

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

0
ответ дан 3 December 2019 в 02:01
поделиться

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

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

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

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

0
ответ дан 3 December 2019 в 02:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: