Безопасен ли поток AddOrUpdate в ConcurrentDictionary?C#

Место общения программистов C#
Ответить
Anonymous
 Безопасен ли поток AddOrUpdate в ConcurrentDictionary?

Сообщение Anonymous »

Я пытался использовать метод AddOrUpdate в ConcurrentDictionary.

Из раздела «Примечания» на этой странице https://msdn.microsoft.com/en-us/librar ... .110).aspx. . там написано


"Однако делегаты для этих методов вызываются вне блокировок, чтобы избежать проблем, которые могут возникнуть от выполнения неизвестного кода при блокировке. Следовательно, код, выполняемый этими делегатами, не подчиняется атомарности операции».


Поэтому я не уверен, что это потокобезопасно. У меня есть один случай: если ключ не найден, значение равно 1, иначе увеличьте значение на 1.

Я написал ниже функцию

Код: Выделить всё

    private static void AddOrUpdate(ConcurrentDictionary map)
{
Random r = new Random();
Thread.Sleep(r.Next(10));
map.AddOrUpdate(Key, 1, (key, value) => value + 1);
}

public static void TestThreadSafe(ConcurrentDictionary map)
{
Thread[] threads = new Thread[Size];
for (int i = 0; i < Size; ++i)
{
threads[i] = new Thread(() => AddOrUpdate(map));
}

foreach (var thread in threads)
{
thread.Start();
}
}
создал около 300 000 потоков и запустил их параллельно. Результат всегда 300 000.

Является ли метод, описанный выше, потокобезопасным? Когда AddOrUpdate не является потокобезопасным?

Подробнее здесь: https://stackoverflow.com/questions/391 ... dictionary
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»