Подтвердить что ты не робот

Как определить threadafe?

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

Итак, как вы объясните код Threadsafe для кого-то нового для потоковой передачи? Мои идеи для вариантов - это момент:

  • Используете ли вы список того, что делает код? потокобезопасный vs. поток небезопасный
  • Определение книги
  • Полезная метафора
4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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

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

Ответ 3

G'day,

Хорошее место для начала - прочитать статью POSIX по безопасности потоков.

Изменить: Только первые несколько параграфов дают вам краткий обзор безопасности потоков и кода повторного входа.

НТН

веселит,

Ответ 4

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

Ответ 5

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

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

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

Ответ 7

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

Ответ 8

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

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

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

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