Иногда я вижу термин "free-threaded" для описания класса или метода. Похоже, что он имеет аналогичное или идентичное значение для "потокобезопасности".
Есть ли разница между этими двумя членами?
Иногда я вижу термин "free-threaded" для описания класса или метода. Похоже, что он имеет аналогичное или идентичное значение для "потокобезопасности".
Есть ли разница между этими двумя членами?
В других контекстах могут быть другие вещи, но в тех случаях, в которых я работал раньше, "free threaded" означает, что он работает или, по крайней мере, может работать, в разных потоках без какой-либо сортировки между квартирами.
Квартира-резьба по контрасту блокирует разные "квартиры" с отдельными копиями "глобальных" данных (что, следовательно, не является глобальным, когда вы об этом думаете) и либо разрешает работать только один поток в квартире, либо позволяет несколько, но которые все еще будут отделены от тех, которые используют другие квартиры.
Теперь, поскольку модель квартиры предлагает некоторую независимость от потока, некоторые (но не все) проблемы с безопасностью потока уходят. Кусок кода, который предназначен для работы в модели квартиры, будет потокобезопасным, но некоторые или все из этих потоков безопасности исходят из модели квартиры.
Свободная резьбовая часть кода должна обеспечить полные гарантии какой-либо степени безопасности потока, которую она заявляет сама.
Это означает, что это в значительной степени означает то же самое, что и потокобезопасное, для любых целей и целей, в которых вам также не нужно учитывать безопасность потоков использования кода модели квартиры.
Я только что провел некоторое исследование о том, что может означать "свободная нить", и я также закончил с COM. Позвольте мне сначала привести два отрывка из книги Дон Бокса " Essential COM" 1998 года. (На самом деле книга содержит больше разделов о модели со свободным потоком, но я пока оставлю это здесь.)
Поток выполняется ровно в одной квартире за раз. Прежде чем поток может использовать COM, он должен сначала войти в квартиру. […] COM определяет два типа квартир: многопоточные (MTA) и однопоточные (STA). Каждый процесс имеет не более одного MTA; однако процесс может содержать несколько STA. Как следует из их имен, несколько потоков могут выполняться в MTA одновременно, тогда как в STA может выполняться только один поток. [...]
- со страниц 200-201. (Акцент добавлен мной.)
Каждый CLSID в DLL может иметь свой собственный
ThreadingModel
. [...]
ThreadingModel="Both"
указывает, что класс может выполняться в MTA или STA.ThreadingModel="Free"
указывает, что класс может выполняться только в MTA.ThreadingModel="Apartment"
указывает, что класс может выполняться только в STA.- Отсутствие значения
ThreadingModel
подразумевает, что класс может работать только на основной STA. Основная STA определяется как первая STA, которая будет инициализирована в процессе.- со страницы 204. (Форматирование и выделение добавлены мной.)
Я предполагаю, что это означает, что компонент (класс), который объявлен как свободнопоточный, выполняется в MTA, где возможен параллелизм нескольких потоков и явно разрешены вызовы компонента из разных потоков; то есть. Свободнопоточный компонент поддерживает многопоточную среду. Очевидно, что для достижения этого он должен быть поточно-ориентированным.
Противоположным будет компонент, который предназначен для STA, т.е. разрешает звонки только из одного потока. Такой класс не должен быть потокобезопасным (потому что COM позаботится о том, чтобы ни один другой поток, кроме того, который "вошел"/настроил STA, не мог использовать компонент в первую очередь, то есть COM защищает компонент от одновременный доступ).
Вывод: термин COM "свободная нить", по существу, имеет те же значения, что и более общий термин "потокобезопасный".
PS: Этот ответ предполагает, что "потокобезопасный" в основном означает что-то вроде "может иметь дело с одновременным доступом (возможно, из разных потоков)".
PPS: я действительно задаюсь вопросом, является ли "свободная нить" противоположностью "наличия привязки к потоку".
ПОМНИТЕ: BUDS2GO (https://www.buds2go.ca/) - это сайт, который перенаправил всех в GETCHA GANJA, который внезапно (без объяснения причин) закрылся, похитил сотни долларов у клиентов (и не обращая внимания на какую-либо систему вознаграждений или накопления). очков) тем временем. ИЗБЕГАЙТЕ ЭТОГО САЙТА!