https://docs.microsoft.com/en-us/dotnet/standard/collections/thread-safe/
1)Почему все потокобезопастные коллекции предаставляют извлечение только по одному элементу (почему нельзя пачкой прочитать и удалить за раз???)? (For как я понял не удаляет)?
2)На заборе написано что они без блокировок и реализованны через (SpinLock and SpinWait)... Но SpinLock and SpinWait — это блокировка поуда недоступно — чем отличается от блокировок на простом мутексе? Ничем?
Здравствуйте, vvv848165@ya.ru, Вы писали:
VYR>1)Почему все потокобезопастные коллекции предаставляют извлечение только по одному элементу (почему нельзя пачкой прочитать и удалить за раз???)? (For как я понял не удаляет)?
Потому что они не просто потокобезопасные, а, по возможности, lock free. А групповые операции на lock free плохо ложаться.
VYR>2)На заборе написано что они без блокировок и реализованны через (SpinLock and SpinWait)... Но SpinLock and SpinWait — это блокировка поуда недоступно — чем отличается от блокировок на простом мутексе? Ничем?
Зависит от коллекции. Dictionary не lock free (точнее не полностью, на создании бакета локальная блокировка), очередь, стек и список — lock free.
Здравствуйте, Ночной Смотрящий, Вы писали: НС> lock free
читал в инете про это не понял чем в принципе отличается от обычных мутексов (ведь они тоже основаны на блокировке шины данных)???
фьютекс, как я понял, — тоже неахти — почти всегда будет использовать очередь из ядра (которая на мутексе наверное)
НС>> lock free VYR>читал в инете про это не понял чем в принципе отличается от обычных мутексов (ведь они тоже основаны на блокировке шины данных)???
Потому что блокировка на мьютексе (семафоре, евенте) приводит к context switch блокируемого потока. Т.е. ОС останавливает поток, сохраняет его состояние (содержимое регистров процессора) в память, выбирает на исполнение другой поток, загружает его контекст из памяти, запускает на выполнение.
А при spinwait'e этого не происходит. По ок крутит цикл, периодически проверяя, не наступило ли условие для разблокировки.
Здравствуйте, RushDevion, Вы писали:
RD>ОС останавливает поток, сохраняет его состояние (содержимое регистров процессора) в память, выбирает на исполнение другой поток, загружает его контекст из памяти, запускает на выполнение.
Дак это по-любому происходит много раз за секунду — защищённый режим всётаки — причем даже без мутексов и когда задачи не связаны между собой — поцессор так сделан... RD>А при spinwait'e этого не происходит. По ок крутит цикл, периодически проверяя, не наступило ли условие для разблокировки.
задачи переключаются всегда https://wasm.in/blogs/category/zaschischennyj-rezhim.20/ особенно при ожидании
Здравствуйте, vvv848165@ya.ru, Вы писали:
НС>> lock free VYR>читал в инете про это не понял чем в принципе отличается от обычных мутексов (ведь они тоже основаны на блокировке шины данных)???
lock free использует не блокировки, а retry для отслеживания конфиликтов. В оптимистичном сценарии это дает почти нулевой оверхед.
Здравствуйте, vvv848165@ya.ru, Вы писали:
RD>>ОС останавливает поток, сохраняет его состояние (содержимое регистров процессора) в память, выбирает на исполнение другой поток, загружает его контекст из памяти, запускает на выполнение. VYR>Дак это по-любому происходит много раз за секунду — защищённый режим всётаки
Для современного процессора 1/20 секунды это вечность. Спинлоки обычно на много порядков короче. Если же у тебя блокировки сопоставимы по длительности с переключением потока, то да, от спинлоков только один вред.
Здравствуйте, Ночной Смотрящий, Вы писали:
НС>lock free использует не блокировки, а retry для отслеживания конфиликтов. В оптимистичном сценарии это дает почти нулевой оверхед.
retry!!! что это такое и где можно почитать (это x86 команда?)?
Здравствуйте, Ночной Смотрящий, Вы писали:
НС>Здравствуйте, vvv848165@ya.ru, Вы писали:
VYR>>retry!!! что это такое и где можно почитать (это x86 команда?)?
НС>Почти.
Ну и почему ты решил что там без мутексов обошлось?
Здравствуйте, vvv848165@ya.ru, Вы писали:
VYR>1)Почему все потокобезопастные коллекции предаставляют извлечение только по одному элементу (почему нельзя пачкой прочитать и удалить за раз???)? (For как я понял не удаляет)?
Отвечаю на весь тред разом.
1) Почитайте уже чего-нибудь конкретного про многопоточность и синхронизацию, например Рихтера.
2) Для вставки множества элементов наверняка есть сторонние библиотеки, хотя этого добра больше для Java, там у них и Guava есть, и ещё всякое.