Re[8]: ConcurrentDictionary vs reference type
От: Codealot Земля  
Дата: 19.02.22 15:15
Оценка:
Здравствуйте, samius, Вы писали:

S>Мыло-мочало, начинай сначала


Я не виноват, что ты не понимаешь о чем говоришь.
Ад пуст, все бесы здесь.
Re[8]: ConcurrentDictionary vs reference type
От: Codealot Земля  
Дата: 19.02.22 15:15
Оценка: :))
Здравствуйте, Teolog, Вы писали:

T>Словарь хранит ссылки и позволяет их добавлять и удалять из разных потоков без самопальной внешней синхронизации. Это все для чего он предназначен, и все что делает.

T>Синхронизация доступа в содержимому объекта по ссылке-отдельный веселый вопрос, который к словарю никакого отношения не имеет, и должен решаться вне зависимости от существования, не-существования, реализации и наличия документации на словарь, тем кто делал класс объекта.

Если словарь дает какие-то гарантии по поводу барьера памяти, то это один вопрос, и содержимое объекта можно использовать когда ты его получил из словаря.
Если он таких гарантий не дает, то получив ссылку на объект в другом треде, использовать эту ссылку ты не можешь. А это значит, что сохранять ссылки в словарь попросту нельзя. А это значит, что ссылки на объекты надо запретить в generic constraints класса. Доходит?
Ад пуст, все бесы здесь.
Re[9]: ConcurrentDictionary vs reference type
От: samius Россия http://sams-tricks.blogspot.com
Дата: 19.02.22 15:58
Оценка: :)
Здравствуйте, Codealot, Вы писали:

C>Если словарь дает какие-то гарантии по поводу барьера памяти, то это один вопрос, и содержимое объекта можно использовать когда ты его получил из словаря.

C>Если он таких гарантий не дает, то получив ссылку на объект в другом треде, использовать эту ссылку ты не можешь. А это значит, что сохранять ссылки в словарь попросту нельзя. А это значит, что ссылки на объекты надо запретить в generic constraints класса. Доходит?

Понятно, о чем ты. Не понятно, причем тут ConcurrentDictionary и его документация, если ты опасаешься передать ссылку на объект в другой тред.

https://github.com/stakx/ecma-335/blob/master/docs/i.12.6.8-other-memory-model-issues.md
Re[10]: ConcurrentDictionary vs reference type
От: Codealot Земля  
Дата: 19.02.22 16:05
Оценка:
Здравствуйте, samius, Вы писали:

S>Понятно, о чем ты. Не понятно, причем тут ConcurrentDictionary и его документация, если ты опасаешься передать ссылку на объект в другой тред.


Плохо, что непонятно.
Тебе не приходило в голову, что ConcurrentDictionary именно для того и существует, чтобы использовать его из разных тредов? И если он позволяет использовать объекты — то либо он дает какие-то гарантии по поводу их извлечения, либо его разработчики крупно накосячили?
Ад пуст, все бесы здесь.
Re[10]: ConcurrentDictionary vs reference type
От: vsb Казахстан  
Дата: 19.02.22 16:10
Оценка:
Здравствуйте, samius, Вы писали:

S>Реордерниг памяти — о чем ты?


Пусть изначально

global x := 0;
global y := 0;


В одном потоке выполняется

x := 1;
y := 2;



в другом потоке выполняется

local my_x := x;
local my_y := y;


Указанные инструкции выполняются на уровне машинного кода, т.е. компилятор ничего местами не поменял.

Реордеринг памяти это когда в my_x будет 0, а в my_y будет 2, хотя казалось бы логичны лишь варианты (0, 0) если до другого потока не дошли изменения; (1, 0) если дошло лишь первое изменение и (1, 2) если дошли оба изменения.

На x86 этой ситуации быть не может. На некоторых других архитектурах вроде ARM — может быть.
Re: ConcurrentDictionary vs reference type
От: vsb Казахстан  
Дата: 19.02.22 16:12
Оценка:
Здравствуйте, Codealot, Вы писали:

C>ConcurrentDictionary гарантирует безопасность объектов (если исходить из предположения, что они read-only), или нужны какие-то дополнительные движения с бубном?

C>Документация чего-то не рассматривает этот вопрос

Я думаю, у тебя горе от ума. Используй и не парься. Ну или почитай его исходники и убедись, что там всё хорошо.
Re[9]: ConcurrentDictionary vs reference type
От: karbofos42 Россия  
Дата: 19.02.22 16:13
Оценка:
Здравствуйте, Codealot, Вы писали:

C>Здравствуйте, karbofos42, Вы писали:


K>>Я думал, что документацию для того и делают, чтобы людям не приходилось копаться в реализации и выяснять как что работает.


C>Там не ответов на вопросы, которые я задал.


https://docs.microsoft.com/en-us/dotnet/api/system.collections.concurrent.concurrentdictionary-2?view=net-5.0

All public and protected members of ConcurrentDictionary<TKey,TValue> are thread-safe and may be used concurrently from multiple threads. However, members accessed through one of the interfaces the ConcurrentDictionary<TKey,TValue> implements, including extension methods, are not guaranteed to be thread safe and may need to be synchronized by the caller.

Re[10]: ConcurrentDictionary vs reference type
От: Codealot Земля  
Дата: 19.02.22 16:16
Оценка:
Здравствуйте, karbofos42, Вы писали:

K>https://docs.microsoft.com/en-us/dotnet/api/system.collections.concurrent.concurrentdictionary-2?view=net-5.0

K>

K>All public and protected members of ConcurrentDictionary<TKey,TValue> are thread-safe and may be used concurrently from multiple threads. However, members accessed through one of the interfaces the ConcurrentDictionary<TKey,TValue> implements, including extension methods, are not guaranteed to be thread safe and may need to be synchronized by the caller.


Ты даже не понимаешь о чем идет речь, а туда же.
Имеется в виду потокобезопасность только самого объекта ConcurrentDictionary
Ад пуст, все бесы здесь.
Re[11]: ConcurrentDictionary vs reference type
От: Codealot Земля  
Дата: 19.02.22 16:18
Оценка:
Здравствуйте, vsb, Вы писали:

vsb>На x86 этой ситуации быть не может.


На это тоже не стоит слишком полагаться.
Ад пуст, все бесы здесь.
Re[11]: ConcurrentDictionary vs reference type
От: samius Россия http://sams-tricks.blogspot.com
Дата: 19.02.22 16:20
Оценка:
Здравствуйте, Codealot, Вы писали:

C>Здравствуйте, samius, Вы писали:


S>>Понятно, о чем ты. Не понятно, причем тут ConcurrentDictionary и его документация, если ты опасаешься передать ссылку на объект в другой тред.


C>Плохо, что непонятно.

C>Тебе не приходило в голову, что ConcurrentDictionary именно для того и существует, чтобы использовать его из разных тредов? И если он позволяет использовать объекты — то либо он дает какие-то гарантии по поводу их извлечения, либо его разработчики крупно накосячили?

Давай уберем ConcurrentDictionary и подумаем, можно ли использовать обеъкты из одного потока в другом и почему об этом не пишут на каждому углу, либо разработчики круто накосячили один ты в белом....
Re[11]: ConcurrentDictionary vs reference type
От: karbofos42 Россия  
Дата: 19.02.22 16:32
Оценка:
Здравствуйте, Codealot, Вы писали:

C>Здравствуйте, karbofos42, Вы писали:


K>>https://docs.microsoft.com/en-us/dotnet/api/system.collections.concurrent.concurrentdictionary-2?view=net-5.0

K>>

K>>All public and protected members of ConcurrentDictionary<TKey,TValue> are thread-safe and may be used concurrently from multiple threads. However, members accessed through one of the interfaces the ConcurrentDictionary<TKey,TValue> implements, including extension methods, are not guaranteed to be thread safe and may need to be synchronized by the caller.


C>Ты даже не понимаешь о чем идет речь, а туда же.

C>Имеется в виду потокобезопасность только самого объекта ConcurrentDictionary

Ты хочешь потокобезопасность всего подряд только из-за того, что что-то там положили в потокобезопасную коллекцию.
Я тебе привёл официальную документацию, в которой написано потокобезопасность чего подразумевается в конкретном типе.
Нужна другая потокобезопасность — реализуй на здоровье, можешь на гитхаб выложить даже и кому надо — будет пользоваться.

Я тебе наверно сейчас жизнь испорчу, но они в Dictionary и без потоков накосячили и этим классом тоже пользоваться нельзя.
    class MyKey
    {
        public int Value {get;set;}
        
        public MyKey(int value) { Value = value;}
        
        public override int GetHashCode() => Value;
        
        public override bool Equals(object other) => (other as MyKey)?.Value == Value;
    }
    
    public class Program
    {
        public static void Main(string[] args)
        {
            var dict = new Dictionary<MyKey, string>();
            var key = new MyKey(10);
            dict.Add(key, "string1");            
            key.Value = 20;
            dict.Add(key, "string2");
        }
    }

И ключ словаря менять разрешают и два элемента словаря под одним ключом записывать... О чём они там вообще думают?
Отредактировано 19.02.2022 16:43 karbofos42 . Предыдущая версия .
Re[12]: ConcurrentDictionary vs reference type
От: Codealot Земля  
Дата: 19.02.22 16:42
Оценка:
Здравствуйте, samius, Вы писали:

S>Давай уберем ConcurrentDictionary и подумаем, можно ли использовать обеъкты из одного потока в другом и почему об этом не пишут на каждому углу, либо разработчики круто накосячили один ты в белом....


Нет, не давай уберем. Мы говорим о типе, созданном специально для многопоточности. И если простейший сценарий положить/извлечь объект опасен, то использовать ConcurrentDictionary с объектами попросту нельзя. Будешь спорить?
Ад пуст, все бесы здесь.
Re[12]: ConcurrentDictionary vs reference type
От: Codealot Земля  
Дата: 19.02.22 16:42
Оценка:
Здравствуйте, karbofos42, Вы писали:

K>Ты хочешь потокобезопасность всего подряд только из-за того, что что-то там положили в потокобезопасную коллекцию.

K>Я тебе привёл официальную документацию, в которой написано потокобезопасность чего подразумевается в конкретном типе.
K>Нужна другая потокобезопасность — реализуй на здоровье, можешь на гитхаб выложить даже и кому надо — будет пользоваться.

Я повторю еще раз, для самых быстрых.

Мы говорим о типе, созданном специально для многопоточности. И если в нем простейший сценарий положить/извлечь объект опасен, то использовать ConcurrentDictionary с объектами попросту нельзя. А это значит, что generic constraint типа должен в явном виде их запретить. Не доходит?
Ад пуст, все бесы здесь.
Re[11]: ConcurrentDictionary vs reference type
От: samius Россия http://sams-tricks.blogspot.com
Дата: 19.02.22 16:46
Оценка:
Здравствуйте, vsb, Вы писали:

vsb>Реордеринг памяти это когда в my_x будет 0, а в my_y будет 2, хотя казалось бы логичны лишь варианты (0, 0) если до другого потока не дошли изменения; (1, 0) если дошло лишь первое изменение и (1, 2) если дошли оба изменения.


Понятно, это на уровне конкретного CPU, и в модели памяти дотнета (и джавы тоже) такого нет.

vsb>На x86 этой ситуации быть не может. На некоторых других архитектурах вроде ARM — может быть.

Такое — верятно. Но речь ведь в данном треде немного о другом, почему можно взять из ConcurrentDictionary ссылку на объект и ей пользоваться... Но ответ как раз в модели памяти дотнета, а не в библиотечном классе ConcurrentDictionary или его документации.
Re[13]: ConcurrentDictionary vs reference type
От: samius Россия http://sams-tricks.blogspot.com
Дата: 19.02.22 16:48
Оценка: +2 :)
Здравствуйте, Codealot, Вы писали:

C>Здравствуйте, samius, Вы писали:


S>>Давай уберем ConcurrentDictionary и подумаем, можно ли использовать обеъкты из одного потока в другом и почему об этом не пишут на каждому углу, либо разработчики круто накосячили один ты в белом....


C>Нет, не давай уберем. Мы говорим о типе, созданном специально для многопоточности. И если простейший сценарий положить/извлечь объект опасен, то использовать ConcurrentDictionary с объектами попросту нельзя. Будешь спорить?

Лет несколько назад — поспорил бы.

А сейчас — ты сам себе Буратино!
Re[13]: ConcurrentDictionary vs reference type
От: karbofos42 Россия  
Дата: 19.02.22 16:49
Оценка:
Здравствуйте, Codealot, Вы писали:

C>Здравствуйте, karbofos42, Вы писали:


K>>Ты хочешь потокобезопасность всего подряд только из-за того, что что-то там положили в потокобезопасную коллекцию.

K>>Я тебе привёл официальную документацию, в которой написано потокобезопасность чего подразумевается в конкретном типе.
K>>Нужна другая потокобезопасность — реализуй на здоровье, можешь на гитхаб выложить даже и кому надо — будет пользоваться.

C>Я повторю еще раз, для самых быстрых.


C>Мы говорим о типе, созданном специально для многопоточности. И если в нем простейший сценарий положить/извлечь объект опасен, то использовать ConcurrentDictionary с объектами попросту нельзя. А это значит, что generic constraint типа должен в явном виде их запретить. Не доходит?


Я там дополнил своё сообщение примером с "обычным" словарём.
Создали специальный тип для хранения значений по уникальным ключам, но и тут накосячили.
Ничем нельзя пользоваться выходит, нужно всё своё писать правильное.
Re[11]: ConcurrentDictionary vs reference type
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 19.02.22 17:21
Оценка:
Здравствуйте, Codealot, Вы писали:

C>Здравствуйте, karbofos42, Вы писали:


K>>https://docs.microsoft.com/en-us/dotnet/api/system.collections.concurrent.concurrentdictionary-2?view=net-5.0

K>>

K>>All public and protected members of ConcurrentDictionary<TKey,TValue> are thread-safe and may be used concurrently from multiple threads. However, members accessed through one of the interfaces the ConcurrentDictionary<TKey,TValue> implements, including extension methods, are not guaranteed to be thread safe and may need to be synchronized by the caller.


C>Ты даже не понимаешь о чем идет речь, а туда же.

C>Имеется в виду потокобезопасность только самого объекта ConcurrentDictionary
А что по твоему еще должно быть?
За потокобезопасность объекты ты уже сам должен позаботиться.
Или ты хочешь, что бы внутри методов класса автоматически генерировалиь потокобезопасные конструкции изменения полей, volatile
Ну и стоит почитать Доступ к локальной переменной из разных потоков
Автор: Aquilaware
Дата: 18.11.20
и солнце б утром не вставало, когда бы не было меня
Re[14]: ConcurrentDictionary vs reference type
От: Codealot Земля  
Дата: 19.02.22 17:22
Оценка: :)
Здравствуйте, karbofos42, Вы писали:

K>Я там дополнил своё сообщение примером с "обычным" словарём.


Я должен искать, где и что ты там дополнил?

K>Ничем нельзя пользоваться выходит, нужно всё своё писать правильное.


Я таки единственный солдат во всей израильской армии?
Ад пуст, все бесы здесь.
Re[12]: ConcurrentDictionary vs reference type
От: Codealot Земля  
Дата: 19.02.22 17:22
Оценка: -1
Здравствуйте, samius, Вы писали:

S>Понятно, это на уровне конкретного CPU, и в модели памяти дотнета (и джавы тоже) такого нет.


И в ней тоже есть. Просто ты не знаешь базовые концепции многопоточности, вот и всё.
Ад пуст, все бесы здесь.
Re[14]: ConcurrentDictionary vs reference type
От: Codealot Земля  
Дата: 19.02.22 17:22
Оценка: -3
Здравствуйте, samius, Вы писали:

S>Лет несколько назад — поспорил бы.

S>А сейчас — ты сам себе Буратино!

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