Разница между "свободной резьбой" и "потокобезопасной"
Иногда я вижу термин "свободный поток" для описания класса или метода. Похоже, что имеет аналогичное или идентичное значение слова "потокобезопасный".
Есть ли разница между двумя терминами?
3 ответа
Вполне могут быть и другие вещи, подразумеваемые в других контекстах, но в случаях, с которыми я работал в прошлом, "свободная резьба" означает, что она работает или, по крайней мере, может работать в разных потоках без какого-либо сортировки между квартирами.
Потоки в квартирах, напротив, блокируют разные "квартиры" с отдельными копиями "глобальных" данных (что, следовательно, на самом деле не является глобальным, когда вы об этом думаете) и либо позволяют работать только одному потоку в квартире, либо позволяют нескольким, но который будет по-прежнему отделен от тех, кто использует другие квартиры.
Теперь, поскольку модель квартиры предлагает некоторую собственную безопасность потоков, некоторые (но не все) проблемы безопасности потоков исчезают. Часть кода, предназначенная для работы в модели квартиры, будет поточно-ориентированной, но часть или вся эта безопасность потока проистекает из модели квартиры.
Свободный многопоточный фрагмент кода должен предоставить полную гарантию того уровня безопасности потоков, который он требует.
Это означает, что это в значительной степени означает то же самое, что и потокобезопасность, для любых целей и задач, где вам также не нужно учитывать безопасность потоков при использовании кода модели квартиры.
Я только что провел некоторое исследование о том, что может означать "свободная нить", и я также закончил с 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: я действительно задаюсь вопросом, является ли "свободная нить" противоположностью "схожести потоков".
«Свободный от потоков» и «потокобезопасный» имеют разное значение. Например, ASP.NET может использовать «состояние приложения» для обмена данными между различными веб-сеансами и пользователями приложения (также известного как виртуальный каталог IIS и все подкаталоги). Справка Microsoft сказала:
https://docs.microsoft.com/en-us/previous-versions/aspnet/ms178594(v=vs.100)
Состояние приложения является свободным от потоков, что означает, что к данным состояния приложения могут одновременно обращаться многие потоки. Поэтому важно убедиться, что при обновлении данных о состоянии приложения вы делаете это потокобезопасным способом, включая встроенную поддержку синхронизации. Вы можете использовать методы Lock и UnLock для обеспечения целостности данных, блокируя данные для записи только одним источником за раз.
Поэтому я понимаю, что «состояние приложения» можно читать одновременно; но для обновления его содержимого ваши исходные коды ASP.NET должны использовать операции блокировки и разблокировки.
Это может распространить понимание на домен COM. «Свободный поток» для квартиры MTA означает, что потоки могут читать данные COM одновременно, но для обновления данных COM в MTA ваши исходные коды должны использовать способ синхронизации самостоятельно. С другой стороны, STA является «поточно-ориентированным» самим COM. Ваша программа может напрямую и легко получить доступ к данным STA.