Многопоточный доступ к словарю C # - PullRequest
2 голосов
/ 31 марта 2012

Я понимаю, что словари C # не являются поточно-ориентированными, когда дело доходит до добавления, чтения и удаления элементов; однако можете ли вы получить доступ к свойству Count словаря C # потокобезопасным способом, если другой поток пишет, читает и удаляет из словаря?

Ответы [ 6 ]

4 голосов
/ 31 марта 2012

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

[Редактировать: как указывает usr, просто потому, что в настоящее время он безопасен для потоков на этом уровне, не означает, что так будет и впредь. У вас нет гарантий]

2 голосов
/ 31 марта 2012

Поскольку свойство - это вызов метода изнутри, на самом деле ситуация не так проста, как на первый взгляд.

  • T1: доступ к свойству Count
  • T1: вызов get_Count () (какая-то инструкция JMP / GOTO ASM)
  • T1: переменная чтения, которая представляет количество элементов == 1
  • T2: добавить новый предмет, реальный счет становится 2
  • T1: возвращает 1, но на самом деле уже есть два элемента

Таким образом, если логика приложения опирается на значение свойства Count - теоретически вы можете получить условие гонки .

1 голос
/ 31 марта 2012

Первое: это опасное мышление. Будьте очень осторожны, если вы положите такую ​​вещь в производство. Возможно, вам следует использовать блокировку или ConcurrentDictionary.

Вам достаточно приблизительного ответа?

Но: Reflector показывает, что count просто читает какое-то поле и возвращает его. Это, вероятно, не изменится навсегда. Таким образом, вы разумно могли бы рискнуть в этом случае.

0 голосов
/ 31 марта 2012

Вместо того, чтобы предположить, я пошел и посмотрел на него в отражателе:

public int Count
{
    get
    {
        // count and freeCount are local fields
        return (this.count - this.freeCount);
    }
}

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

0 голосов
/ 31 марта 2012

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

0 голосов
/ 31 марта 2012

Вы можете создать словарь как статический объект только для чтения, и lock это при его изменении ... что должно решить большинство проблем, я бы подумал.

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