Разница между "свободной резьбой" и "потокобезопасной" - PullRequest
29 голосов
/ 08 октября 2010

Иногда я вижу термин «свободный поток» для описания класса или метода.Похоже, что оно имеет аналогичное или идентичное значение слова «потокобезопасный».

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

Ответы [ 2 ]

20 голосов
/ 08 октября 2010

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

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

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

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

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

13 голосов
/ 01 февраля 2011

Я только что провел некоторое исследование о том, что может означать «свободная нить», и я также закончил с COM.Позвольте мне сначала привести два отрывка из книги Дона Бокса 1998 года Essential COM .(На самом деле книга содержит больше разделов о модели со свободным потоком, но я пока оставлю это здесь.)


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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...