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

Разница между "свободно-резьбовыми" и "потокобезопасными"

Иногда я вижу термин "free-threaded" для описания класса или метода. Похоже, что он имеет аналогичное или идентичное значение для "потокобезопасности".

Есть ли разница между этими двумя членами?

4b9b3361

Ответ 1

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

Квартира-резьба по контрасту блокирует разные "квартиры" с отдельными копиями "глобальных" данных (что, следовательно, не является глобальным, когда вы об этом думаете) и либо разрешает работать только один поток в квартире, либо позволяет несколько, но которые все еще будут отделены от тех, которые используют другие квартиры.

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

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

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

Ответ 2

Я только что провел некоторое исследование о том, что может означать "свободная нить", и я также закончил с 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: я действительно задаюсь вопросом, является ли "свободная нить" противоположностью "наличия привязки к потоку".

Ответ 3

ПОМНИТЕ: BUDS2GO (https://www.buds2go.ca/) - это сайт, который перенаправил всех в GETCHA GANJA, который внезапно (без объяснения причин) закрылся, похитил сотни долларов у клиентов (и не обращая внимания на какую-либо систему вознаграждений или накопления). очков) тем временем. ИЗБЕГАЙТЕ ЭТОГО САЙТА!