Threadsafe
термин, который брошен вокруг документации, однако редко существует объяснение того, что это означает, особенно на языке, который понятен кому-то учащемуся распараллеливающий впервые.
Таким образом, как Вы объясняете Threadsafe
кодировать кому-то плохо знакомому с поточной обработкой? Мои идеи для опций являются моментом:
Когда меня спрашивают " безопасен ли этот код нити ?" Мне всегда приходится отступать и спрашивать ", какие именно сценарии потоков вас волнуют?" и ", что именно является правильным поведением объекта в каждом из этих сценариев?".
Невозможно сказать, что код "thread safe", не сообщив каким-то образом о том, какое нежелательное поведение делают и не предотвращают используемые нитевые механизмы безопасности.
Многопоточность приводит к недетерминированному выполнению - Вы не знаете точно, когда выполняется определенный участок параллельного кода.
Учитывая это, это замечательное многопоточное учебное пособие определяет безопасность потока следующим образом:
Поточная безопасность кода - это код, который не имеет неопределенности перед лицом любого сценария многопоточности. Безопасность потоков достигается в первую очередь блокировкой, а также уменьшением возможностей взаимодействия между потоками.
Это означает, что независимо от того, как именно выполняются потоки, поведение всегда четко определено (и, следовательно, не зависит от условий гонки ).
.i может быть, это и неправильно, но одним из критериев потоковой безопасности является использование только локальных переменных. Использование глобальных переменных может иметь неопределенный результат, если одна и та же функция вызывается из разных потоков.
.Я бы сказал, чтобы понять thread safe, начните с понимания разницы между thread safe функцией и reentrant функцией.
Пожалуйста, проверьте Разницу между thread-safety и reentrancy для подробностей.
.G'day,
Хорошее место для начала - чтение POSIX-бумаги по безопасности резьбы .
Правка: Только первые несколько абзацев дают краткий обзор по безопасности потока и код повторного ввода.
HTH
cheers,
Потокобезопасная функция/объект (далее - объект) - это объект, который предназначен для поддержки нескольких одновременных вызовов. Это может быть достигнуто сериализацией параллельных запросов или какой-то поддержкой переплетенных вызовов.
По сути, если объект безопасно поддерживает параллельные запросы (от нескольких потоков), он является потокобезопасным. Если объект не является потокобезопасным, несколько параллельных вызовов могут привести к повреждению его состояния.
Рассмотрим журнал регистрации в отеле. Если человек пишет в книге, а появляется другой человек и начинает одновременно писать своё сообщение, то в конечном итоге получится смесь обоих сообщений. Это также может быть продемонстрировано несколькими потоками, записывающими в выходной поток.
Tread-safe код - это код, который не подведет, так как одни и те же данные были изменены сразу в двух местах. Потокобезопасный код - это меньшее понятие, чем параллельно безопасный код, поскольку он предполагает, что на самом деле это были два потока одной и той же программы, а не (скажем) аппаратные модификации данных или операционная система.
Особенно ценный аспект этого термина заключается в том, что он относится к спектру параллельного поведения, где потокобезопасность является самым сильным, безопасным для прерываний. является более слабым ограничением, чем потокобезопасность, а реентерабельность еще слабее.
В случае потокобезопасности это означает, что рассматриваемый код соответствует согласованному API и использует ресурсы таким образом, что другой код в другом потоке (например, другой, параллельный экземпляр самого себя) не вызовет несогласованности. , если он также соответствует тому же шаблону использования. шаблон использования ДОЛЖЕН быть указан для любых разумных ожиданий потоковой безопасности.
Ограничение безопасности прерывания обычно не появляется в современном коде среды пользователя, потому что операционная система довольно хорошо скрывает это, однако в режиме ядра это очень важно. Это означает, что код завершится успешно, даже если во время его выполнения сработает прерывание.
Последний вариант, реентерабельность, почти гарантирован для всех современных языков, как в пользовательской среде, так и за ее пределами, и это просто означает, что часть кода может быть введена более одного раза, даже если выполнение еще не предшествовало из кода. раздел в более старых случаях. Это может произойти, например, в случае рекурсивных вызовов функций. Очень легко нарушить реентерабельность, предоставляемую языком, путем доступа к общей глобальной переменной состояния в нереентерабельном коде.