Nano Hash - криптовалюты, майнинг, программирование

.NET CLR — синхронизация ссылок на объекты

В многопоточном приложении .NET

Предположим, что первый поток записывает в список. Второй поток очищает все элементы. А третий поток читает из списка.

Что произойдет, если второй и третий потоки получат доступ к одному и тому же объекту списка «действительно» в одно и то же время на уровне CLR. Я не имею в виду объекты синхронизации .NET и механизм блокировки.

Я имею в виду, когда CLR обращается к элементам списка из ссылки (третьим потоком)), что произойдет, если список, на который указывает ссылка, изменится (вторым потоком)?


Ответы:


1

Плохие вещи.

Общедоступные статические (общие в Visual Basic) члены этого типа являются потокобезопасными. Не гарантируется, что все члены экземпляра будут потокобезопасными.

List<T> может одновременно поддерживать несколько программ чтения, если коллекция не изменяется. Перечисление в коллекции по своей сути не является потокобезопасной процедурой. В редких случаях, когда перечисление сталкивается с одним или несколькими доступами для записи, единственный способ обеспечить потокобезопасность — заблокировать коллекцию на время всего перечисления. Чтобы разрешить доступ к коллекции нескольким потокам для чтения и записи, необходимо реализовать собственную синхронизацию.

19.08.2011

2

Он взрывается. InvalidOperationException выбрасывается, так как перечисление изменилось.

19.08.2011
  • Перечисление не используется. Рассмотрите возможность простого доступа к первому элементу списка 19.08.2011

  • 3

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

    //c#
    List<object> myList...
    
    //at reading thread
    if (myList.Count > 0)
    {
        object item = myList[0];//get the item at the first index of the collection.
    }
    
    //at writing thread
    myList.Clear();
    

    Поток записи обновляет список в то же время, когда поток чтения читает из списка, поэтому предположим, что выполнение было следующим:
    Поток чтения проверяет, есть ли элементы в коллекции, и находит, что на нем есть некоторые элементы ".Count > 0 верно", поэтому он продолжается, но прежде чем он достигнет следующей строки, переключение контекста потока приостанавливает поток чтения, переключаясь на поток записи, поэтому он выполняет свою код myList.Clear(); в этот момент контекст потока переключается обратно на поток чтения, чтобы продолжить его выполнение, поэтому он пытается получить myList[0], но коллекция была пустой в этот момент потоком записи, поэтому он завершится ошибкой с исключением IndexOutOfRange..

    Другой сценарий: если поток чтения, в котором выполняется итерация, выбрасывает коллекцию с использованием foreach, а поток записи просто меняет коллекцию, «добавляет/удаляет» некоторые элементы, он снова выдает исключение из-за изменения коллекции во время цикла.

    Таким образом, вы должны использовать некоторый механизм синхронизации при взаимодействии со списком, таким как lock в C# или с использованием класса Monitor. Однако, если вы используете 4.0, вы можете переключиться на использование ConcurrentCollection вместо обычных списков, они являются потокобезопасными коллекциями.

    19.08.2011
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..