Какие функции делают класс потокобезопасным?

В 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;
}

спасибо

25
задан Amir Saniyan 13 July 2011 в 08:08
поделиться

3 ответа

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

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

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

Прочитайте Threading in C # Джозефа Албахари . Это один из лучших и наиболее проверенных доступных ресурсов.

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

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

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

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

20
ответ дан 28 November 2019 в 21:15
поделиться

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

1
ответ дан 28 November 2019 в 21:15
поделиться

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

1
ответ дан 28 November 2019 в 21:15
поделиться
Другие вопросы по тегам:

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