Здравствуйте, Аноним, Вы писали:
| Скрытый текст |
| А>Добрый день,
А>На собеседовании задали вопрос:
А>есть класс:
А>А> 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 ?
Только если Вы пытаетесь работать с любым из словарей из более чем одного потока