MSDN: Что такое “Потокобезопасность”?

Во многих документах MSDN это записано в соответствии с заголовком Потокобезопасности;

"Любые общедоступные помехи (Совместно использованный в Visual Basic) члены этого типа ориентированы на многопотоковое исполнение. Любые члены экземпляра, как гарантируют, не будут ориентированы на многопотоковое исполнение".

например; здесь

кто-то может объяснить это довольно простым способом? Спасибо :)

10
задан Michael Petrotta 29 June 2010 в 05:00
поделиться

3 ответа

Эрик Липперт написал об этом отличную запись в блоге . По сути, это само по себе бессмысленно.

Лично я не слишком доверяю MSDN в этом вопросе, когда вижу этот шаблон. Это не всегда означает то, что написано. Например, здесь говорится то же самое о Encoding - несмотря на то, что мы все используем кодировки из нескольких потоков повсюду.

Если у меня нет никаких оснований полагать иначе (что я делаю с Encoding ), я предполагаю, что могу вызвать любой статический член из любого потока без искажения глобального состояния. Если я хочу использовать члены экземпляра одного и того же объекта из разных потоков, я предполагаю, что это нормально, если я гарантирую - посредством блокировки - что только один поток будет использовать объект за раз. (Конечно, это не всегда так. Некоторые объекты имеют сходство с потоками и активно не любят, когда их используют из нескольких потоков, даже с установленной блокировкой. Наглядный пример - элементы управления пользовательским интерфейсом.)

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

Если тип действительно объявляет себя потокобезопасным, я надеюсь, что он предоставит некоторые подробности об этом. Это легко, если он неизменен - ​​вы можете просто использовать экземпляры, как вам нравится, не беспокоясь о них.Это частично или полностью «потокобезопасные» типы, которые изменяемы там, где важны детали.

12
ответ дан 3 December 2019 в 18:31
поделиться

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

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

5
ответ дан 3 December 2019 в 18:31
поделиться

«Потокобезопасный» объект означает, что если два потока используя его (или очень близко, в однопроцессорных системах) в одно и то же время, нет никаких шансов, что он будет поврежден указанным доступом. Обычно это достигается установкой и снятием блокировок, которые могут вызвать узкие места, поэтому «потокобезопасность» также может означать «медленная», если это делается, когда в этом нет необходимости.

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

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

4
ответ дан 3 December 2019 в 18:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: