msdn: Что такое "безопасность потоков"? - PullRequest
10 голосов
/ 29 июня 2010

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

"Любые открытые статические (Shared в Visual Basic) члены этого типа являются потокобезопасными. Любые элементы экземпляра не гарантируются как потоковыесейф. "

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

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

Ответы [ 4 ]

12 голосов
/ 29 июня 2010

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

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

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

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

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

5 голосов
/ 29 июня 2010

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

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

4 голосов
/ 29 июня 2010

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

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

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

0 голосов
/ 03 сентября 2011

Чтобы понять это, рассмотрим следующий пример.В описании MSDN класса .net HashSet есть часть, которая говорит о безопасности потоков.В случае класса HashSet MSDN говорит: «Любые открытые статические (Shared в Visual Basic) члены этого типа являются поточно-ориентированными.Ни одному члену экземпляра не гарантируется поточная безопасность ». Конечно, мы все знаем концепцию условий гонки и взаимоблокировок, но что Microsoft хочет сказать простым английским языком?Если два потока добавляют два значения к «экземпляру» HashSet, существует некоторая ситуация, когда мы можем получить его счет как единое целое.Конечно, в этой ситуации объект HashSet поврежден, так как теперь у нас есть два объекта в HashSet, но его счетчик показывает только один.Однако общедоступная статическая версия HashSet никогда не столкнется с таким повреждением, даже если два потока одновременно добавляют значения.

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