Какие функции делают класс потокобезопасным? - PullRequest
25 голосов
/ 13 июля 2011

В MSDN некоторые классы .NET описаны следующим образом:

" Этот тип является поточно-ориентированным. "

или

"Открытые статические (совместно используемые в Visual Basic) члены этого типа являются поточно-ориентированными. Члены экземпляра не гарантированно являются поточно-ориентированными. ".

Мой вопрос заключается в том, какие функции делают класс поточным.безопасно?

  • Существуют ли какие-либо стандарты, рекомендации или рекомендации для программирования безопасности потоков?

  • Когда я использую ключевое слово lock (C #), оноозначает, что мой класс поточно-ориентирован или нет?

  • Как оценить потокобезопасность класса?Есть ли какие-либо ИСПЫТАНИЯ, чтобы убедиться, что класс на 100% безопасен для потоков?

Пример:

public class MyClass
{
    public void Method()
    {
        lock (this)
        {
            // Now, is my class 100% thread-safe like Microsoft classes?
        }
    }
    type m_member1;
    type m_member2;
}

спасибо

Ответы [ 6 ]

20 голосов
/ 13 июля 2011

Существуют ли какие-либо стандарты, рекомендации или рекомендации по безопасности потоков? программирование

Наиболее важным стандартом является обеспечение того, чтобы все статические элементы были поточно-ориентированными. Вы увидите, что все хорошо написанные API, включая библиотеку базовых классов .NET, дают такую ​​гарантию. Для этого есть действительно веская причина. Поскольку статические члены совместно используются в AppDomain, они могут использоваться многими различными потоками, даже если вы этого даже не осознаете. В лучшем случае было бы неудобно предоставлять собственную синхронизацию для каждого доступа к статическому члену. Представьте себе, что было бы, если бы Console.WriteLine не был потокобезопасным.

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

Чтение Создание потоков в C # Джозефом Альбахари . Это один из лучших и наиболее проверенных доступных ресурсов.

Когда я использую ключевое слово lock (C #), это означает, что мой класс поточно-ориентирован или нет?

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

Как оценить потокобезопасность класса? Есть ли тесты, которые будут уверены, что класс на 100% безопасен для потоков?

Это вопрос на миллион долларов! невероятно сложно протестировать многопоточный код. Инструмент CHESS , предоставляемый Microsoft Research, является одной из попыток облегчить жизнь параллельным программистам.

11 голосов
/ 13 июля 2011

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

Существует несколько способов сделать класс потокобезопасным:

  1. Сделайте его неизменным, если класс не содержит состояния, которое безопасно использовать одновременно из нескольких потоков.
  2. Использование блокировки для уменьшения параллелизма. Тем не менее, это не гарантия безопасности потоков, это просто гарантирует, что блок кода не будет выполняться одновременно несколькими потоками. Если состояние сохраняется между вызовами методов, оно может стать несовместимым.

То, как вы создаете потокобезопасный класс, действительно зависит от того, что вы хотите сделать с этим классом.

Вы также должны спросить себя, нужно ли сделать мой класс безопасным для потоков? Общая модель большинства UI-фреймворков состоит в том, что существует один поток UI. Например, в WinForms, WPF и Silverlight большая часть кода будет выполняться из потока пользовательского интерфейса, что означает, что вам не нужно встраивать безопасность потоков в ваши классы.

6 голосов
/ 13 июля 2011

Прежде всего, не используйте блокировку (это) .

Это может вызвать взаимные блокировки.Потому что другой код может заблокировать тот же объект за пределами области видимости класса.Вы должны создать локальный Object и использовать его в качестве блокировки класса.

Во-вторых, безопасность потока - сложная проблема.В Интернете есть множество материалов об этом.

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

1 голос
/ 13 июля 2011

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

1 голос
/ 13 июля 2011

Когда я использую ключевое слово lock (C #), это означает, что мой класс поточно-ориентирован или нет? Когда вы используете блокировку, это означает, что часть кода внутри блокировки {} является поточно-ориентированной. Это не гарантирует, что ваш класс является потокобезопасным. И, как сказал Йохай Тиммер, это не очень хорошая идея для lock(this)

Как оценить потокобезопасность класса? Есть ли какие-либо ИСПЫТАНИЯ, чтобы убедиться, что класс на 100% безопасен для потоков? Я не уверен, что есть какие-либо тесты, потому что в многопоточности всегда возможно, что вы случайно получите правильные результаты. Таким образом, чтобы убедиться, что вы можете просмотреть код класса, чтобы убедиться, что он является поточно-ориентированным

1 голос
/ 13 июля 2011

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

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