Здравствуйте, ili, Вы писали:
R>>ЗЫ: Возможно баян, или я чего-то не понял, сильно не ругайте, если зря побеспокоил. ili>fixed due to 769 revision
Не-не-не! Девид Блейн! Не-не-не!
Это не фиксед.
Это race condition.
Смотри строки с !!!
ну посмотрел, и ничо не понял... в чем трабла-то? я того, необразованный, чо такое "race condition" не знаю
вроде догадываюсь... к чему-ты, но там сеть еще одна строчка, не?
WH>Кстати, а почему Hashtable? Всроде первый фреймворк забросили?
а там исторически много где Hashtable пользуется. А переделывать на Dictionary<K, V>... я как-то думал в порядке безделья... вот только бенефита особого нет. словарь даст такой прирост производительности, что в микроскоп не разглядишь...
Здравствуйте, ili, Вы писали:
ili>ну посмотрел, и ничо не понял... в чем трабла-то? я того, необразованный, чо такое "race condition" не знаю ili>вроде догадываюсь... к чему-ты, но там сеть еще одна строчка, не?
Андрей прав, одновременный вызов TypeAccessor.GetCustomTypeDescriptor из 32 разных ниток приведёт к тому, что часть дескрипторов будет утеряна. Тут нужно либо заменить Hashtable на Dictionary<,> у которого таких проблем нет, либо защитить _descriptors.Add(type, descriptor) при помощи lock (_descriptors.SyncRoot).
Здравствуйте, Блудов Павел, Вы писали:
БП>Андрей прав, одновременный вызов TypeAccessor.GetCustomTypeDescriptor из 32 разных ниток приведёт к тому, что часть дескрипторов будет утеряна. Тут нужно либо заменить Hashtable на Dictionary<,> у которого таких проблем нет, либо защитить _descriptors.Add(type, descriptor) при помощи lock (_descriptors.SyncRoot).
и чем это спасёт? там уже есть один lock от второго врят ли легче станет.
и почему Dictionary<,> не имеет таких проблем? почему 32 потока? дайте хоть ссылку на почитать, а то гугль мне что-то невнятное говорит, а кики рекомендует спасаться синхронизацией.
Здравствуйте, ili, Вы писали:
ili>и чем это спасёт? там уже есть один lock от второго врят ли легче станет.
И правда есть. Тогда конечно вторая блокировка вообще безсмысленна. ili>и почему Dictionary<,> не имеет таких проблем?
Ни почему. Тоже перепутал.
Собственно вот код:
public bool TryGetValue(TKey key, out TValue value)
{
int index = FindEntry(key);
if (index >= 0)
{
value = entries[index].value;
return true;
}
value = default(TValue);
return false;
}
Тут сначала ищется индекс в массиве entries, а затем возвращается значение по этому индексу.
А вот код метода Resize
Тут сначала делается точная копия массива entities, но большего размера, а потом заменяется ссылка на сам массив.
Даже если предположить, что в момент выполнения
value = entries[index].value;
произойдёт подмена этих entities, то будет возвращён либо элемент из старого массива, либо из нового, который включает в себя старый массив целиком. Даже сборщик мусора не сможет нам помешать, т.е. локальная ссылка на старый entities всё ещё лежит в стеке.
Так что текущая реализация Dictionary<,> позволяет доверять возвращаемому TryGetValue значению.
А вот параллельные вызовы метода Dictionary<,>.Add() без синхронизации могут сломать цивилизацию.
Так что Dictionary<,> ничем не лучше (но и не хуже) Hashtable.
ili>почему 32 потока?
Число круглое. ili>дайте хоть ссылку на почитать, а то гугль мне что-то невнятное говорит, а кики рекомендует спасаться синхронизацией.
Если гугль говорит про http://blogs.msdn.com/kimhamil/archive/2008/03/08/hashtable-and-dictionary-thread-safety-considerations.aspx
то это ересь. См. выше.
В общем не обращай внимания. А я пойду высплюсь как следует.