Когда ConcurrentDictionary TryRemove вернет false

Будет ли он возвращать false только в том случае, если словарь не содержит значения для данного ключа, или он также возвращает false из-за условий состязания потоков, как другой поток добавляет / обновляет что-то?

Вопрос в коде :

ConcurrentDictionary<int, string> cd = new ConcurrentDictionary<int, string>();

// This might fail if another thread is adding with key value of 1.
cd.TryAdd(1, "one"); 

// Will this ever fail if no other thread ever removes with the key value of 1?
cd.TryRemove(1); 

Edit: Я думаю, что он вернет false только в том случае, если он не содержит значения для данного ключа, но хочет быть абсолютно уверенным.

73
задан Martin Ingvar Kofoed Jensen 19 August 2010 в 07:22
поделиться

2 ответа

Хотя Митч прав в том, что ConcurrentDictionary не уязвим к условиям гонки, я думаю, что ответ на вопрос, который вы задаете, - да, если ключ присутствует, TryRemove будет работать и вернет true .

В опубликованном вами коде нет способа, чтобы TryRemove возвратил false , поскольку cd - это локальная переменная, к которой больше нигде нет доступа. Но если в каком-то другом коде была указана ссылка на этот объект ConcurrentDictionary и он удалял ключи в отдельном потоке, то вполне возможно, что TryRemove может вернуть false , даже если здесь - но только потому, что ключ уже был удален , а не потому, что со словарем выполняется какое-то другое действие, и ключ каким-то образом "застрял" там.

75
ответ дан 24 November 2019 в 12:24
поделиться

Словарь ConcurrentDictionary не страдает от условий гонки. Вот почему вы используете его.

Возвращаемое значение

true, если объект был удален успешно; в противном случае - false.

5
ответ дан 24 November 2019 в 12:24
поделиться
Другие вопросы по тегам:

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