Потокобезопасность метода Stream.Write - PullRequest
4 голосов
/ 27 июля 2011

Документация MSDN гласит, что методы экземпляра, в том числе Stream.Write, класса Stream не гарантируют поточно-ориентированный, но что это значит? Что произойдет, если один поток попытается вызвать Stream.Write для объекта Stream, прежде чем другой поток не вернется из того же метода для того же объекта? Будет ли сгенерировано исключение или объект поставит в очередь данные для отправки в соответствии с порядком потоков? Некоторые говорят, что нормально звонить без механизма блокировки. Может кто-нибудь уточнить это?

Ответы [ 2 ]

3 голосов
/ 27 июля 2011

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

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

0 голосов
/ 27 июля 2011

Запись является абстрактным методом, что означает, что поведение этого метода определено в подклассах Stream. Некоторые из подклассов Stream могут предоставлять поточно-ориентированные методы записи, а другие - нет. Таким образом, вы не можете сказать, как будет вести себя Stream, если вы вызываете метод Write из разных потоков одновременно, если только вы не знаете, с каким конкретным подклассом Thread вы имеете дело.

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

Но если вы явно используете определенные подклассы Stream и знаете, что он потокобезопасен, блокировка не требуется.

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