Re: Синхронизация на доступ при добавлении объекта
От: Мишень-сан  
Дата: 11.03.10 10:10
Оценка: +2
Здравствуйте, Аноним, Вы писали:

  Скрытый текст
А>Добрый день,
А>На собеседовании задали вопрос:

А>есть класс:


А>
А>    public class SimpleCub 
А>    {
А>        public int X
А>        {
А>            get;
А>            private set;
А>        }

А>        public int Y
А>        {
А>            get;
А>            private set;
А>        }

А>        public int Z
А>        {
А>            get;
А>            private set;
А>        }

А>        public SimpleCub(int x, int y, int z)
А>        {
А>            X = x;
А>            Y = y;
А>            Z = z;
А>        }

А>        #region Equals_GetHashCode Members

А>        public override bool Equals(Object obj)
А>        {
А>            if (obj == null || GetType() != obj.GetType())
А>                return false;
А>            SimpleCub simpleCube = (SimpleCub)obj;
А>            return ((simpleCube.X == X) && (simpleCube.Y == Y) && (simpleCube.Z == Z));
А>        }

А>        public override int GetHashCode()
А>        {
А>            Func<byte[], int> calcHash = (arr) =>
А>                                             {
А>                                                 using (RIPEMD160Managed myRIPEMD160 = new RIPEMD160Managed())
А>                                                 {
А>                                                     return BitConverter.ToInt32(myRIPEMD160.ComputeHash(arr), 0);
А>                                                 }
А>                                             };
            
А>            List<byte> listBytes = new List<byte>(BitConverter.GetBytes(X));
А>            listBytes.AddRange(BitConverter.GetBytes(Y));
А>            listBytes.AddRange(BitConverter.GetBytes(Z));
А>            return calcHash(listBytes.ToArray());
А>        }

А>        #endregion
А>    }
А>


А>по определенным правилам создаются допустим 10 экземпляров данного типа и добавляются в List<SimpleCub> list1

А>эти же созданные экземпляры добавляются в List<SimpleCub> list2
А>создается дочерний поток thread1 и передается в него list1
А>создается дочерний поток thread2 и передается в него list2

А>в дочерних потоках создается (в 1-м):

А>dic1 = new Dictionary<SimpleCub, object>();

А>(во 2-м):

А>dic2 = new Dictionary<SimpleCub, object>();

А>и соответсвенно добавляются элементы SimpleCub (в качестве ключа) в dic1 из list1

А>добавляются элементы SimpleCub (в качестве ключа) в dic2 из list2

А>далее в каждом из дочерних потоках создаются новые SimpleCub и добавляются в dic1 или dic2 в качестве ключа.


А>Вопрос:

А>Нужна ли блокировка(синхронизация) при добавлении элементов в dic1 и dic2 ?

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