|
Заблокирован
|
|
Метод Interlocked.Exchange(Double, Double) не гарантирует одинаковое значение переменной в разных потоках?20.03.2024, 13:45. Показов 2551. Ответов 48
Метод Interlocked.Exchange(Double, Double) обеспечивает атомарность операции присвоения нового значения переменной типа Double.
То есть, InterlockedExchange гарантирует, что изменение переменной и возврат ее исходного значения не будут прерваны другими потоками. Но есть ли гарантия, что данная переменная будет после этого иметь одно и то же значение в разных потоках, в том числе, исполняемых на разных процессорах? Похоже, что нет. Но если нет, то тогда для обеспечения одинакового значения переменной нужно применять lock? И тогда, если блокировать код присвоения с помощью lock, то тогда Interlocked.Exchange уже нет смысла использовать? Правилен ли вывод, что Interlocked.Exchange имеет смысл применять в том случае, когда не нужно, чтобы значение переменной во всех потоках было одинаковым (самым последним)? А преимущество Interlocked.Exchange по сравнению с блокировкой lock в том, что Interlocked.Exchange не тормозит потоки?
0
|
|
| 20.03.2024, 13:45 | |
|
Ответы с готовыми решениями:
48
[Error] cannot convert 'double (*)(double)' to 'double' for argument '1' to 'double pow(double, double)' Ошибки error C2296: -: недопустимо, левый операнд имеет тип "double (__cdecl *)(double,double,double Написать функцию int Search ( double A[], int n , double x), которая находит в массиве double A[n] элемент, значение которого равно x |
|
1152 / 860 / 263
Регистрация: 30.04.2009
Сообщений: 3,603
|
|
| 27.03.2024, 21:31 | |
|
titan4ik, Interlocked для атомарных операций, которые иначе выполнялись бы как последовательность, а так то да, я бы использовал Volatile.Read
1
|
|
|
4693 / 2701 / 734
Регистрация: 02.08.2011
Сообщений: 7,226
|
|||
| 27.03.2024, 23:21 | |||
|
0
|
|||
|
Заблокирован
|
||
| 28.03.2024, 00:08 [ТС] | ||
|
IamRain,
Лучше бы Вы ссылались на сообщение от nicolas2008, я ведь просто скопировал его утверждения. Сам я ничего не утверждаю.
0
|
||
|
1152 / 860 / 263
Регистрация: 30.04.2009
Сообщений: 3,603
|
||||
| 28.03.2024, 03:13 | ||||
|
Метод указан для общего развития. При вызове Monitor.Enter неявно создается MemoryBarrier.
0
|
||||
|
Заблокирован
|
||
| 28.03.2024, 09:06 [ТС] | ||
|
Если во всех трех этих (№№ 1, 3 и 4) методах создается идентичный барьер памяти, то по этой своей сути они равнозначны. И у них общий минус общий - "все попытки чтения будут включать вызов Thread.MemoryBarrier(), а это доп издержки которые не всегда нужны." А отличия лежат в другой плоскости. Насколько они значимы эти отличия? Проблемы психологического характера ("может ввести в ступор большинство погромистов, повышен риск что непонятный код будет удален после короткого тестирования и подтверждения что "все и так работает нормально") понятны и меня мало волнуют. А у метода №2 с lock - самые большие издержки. То есть, пока, кажется так, что можно любой из методов №№ 1, 3 и 4 применять с равным успехом. И что все они лучше по издержкам метода №2 примерно в равной степени.
0
|
||
|
Заблокирован
|
||
| 29.03.2024, 00:18 [ТС] | ||
|
Как раз сегодня увидел плакат с такой надписью:
2
|
||
|
4693 / 2701 / 734
Регистрация: 02.08.2011
Сообщений: 7,226
|
||
| 29.03.2024, 00:43 | ||
|
Уточняю: зачем здесь в списке сравнения lock? Почему бы сюда коней не добавить - не рассказать про Mutex-ы и Semaphore-ы еще?
0
|
||
|
Заблокирован
|
|
| 29.03.2024, 00:50 [ТС] | |
|
IamRain, мешанина если и есть, то у меня в голове
А это нашло отражение и в тексте вопроса (там и lock фигурирует). Так что lock помянуть в ответах было уместно и правильно.Добавлено через 1 минуту Правильный вопрос должен был бы звучать так - Как сделать так, чтобы всё было просто, хорошо и за это ничего не было)
0
|
|
|
4693 / 2701 / 734
Регистрация: 02.08.2011
Сообщений: 7,226
|
|||
| 29.03.2024, 00:53 | |||
|
А Volatile.Read - это, очевидно, только на чтение. То есть через класс Volatile можно более гибко работать с меньшим оверхедом по перфомансу. Ну это все очень нишевое применение - тот, кому понадобится, сам найдет наиболее подходящий способ. Добавлено через 1 минуту
1
|
|||
|
1152 / 860 / 263
Регистрация: 30.04.2009
Сообщений: 3,603
|
||
| 29.03.2024, 03:02 | ||
Но это все из разряда kernel lock, по сути тот же метод 2
0
|
||
|
Заблокирован
|
||
| 29.03.2024, 10:09 [ТС] | ||
|
1) Посмотрел сейчас описание класса Volatile на русском языке. Трудно понять. Видимо машинный перевод.
Но главное понял - если в одном потоке произошла запись в переменную с помощью метода Volatile.Write(), то это не гарантирует, что при чтении в другом потоке с помощью метода Volatile.Read(), даже в последующем по времени (!) относительно Volatile.Write(), будет прочитано уже измененное значение переменной. Не гарантирует. То есть, методы чтения и записи класса Volatile гарантируют только отсутствие перестановки операций. Если Volatile.Write(), то операции, которые идут до него, не могу быть перемещены после него. Если Volatile.Read(), то операции, которые идут после него, не могу быть перемещены до него. 2) Если используется модификатор переменной volatile, то он запрещает перемещать операции через операцию с этой переменной в обе стороны - предшествующие и последующие операции такими и останутся. Но volatile тоже не гарантирует, что во втором потоке будет прочитано значение уже измененное в первом. 3) А если нужны гарантии того, чтобы во всех потоках переменная имела одинаковое значение, то нужно либо очень изощрённо напрягать мосх, либо обходиться методами Interlocked, либо использовать блокировку lock, либо что-то вроде потокобезопасных коллекций. Нужно ещё и это посмотреть;
Интересно, потокобезопасные коллекции есть, а потокобезопасных переменных хотя бы базовых классов (int, double и т.п.) нет.
0
|
||
|
1152 / 860 / 263
Регистрация: 30.04.2009
Сообщений: 3,603
|
|
| 30.03.2024, 22:15 | |
|
titan4ik, а где это такое написано что "не гарантирует"?
Вся потокобезопасность построена на блокировках, атомарных операциях и барьерах памяти. Никаких магических средств в потокобезопасных коллекциях нет, все строится на тех же примитивах. Добавлено через 2 минуты Можете еще про когерентность кеша процессора почитать (согласованность данных для разных ядер). В интернетах пишут что в современных процессорах кеш общий и/или всегда согласован.
1
|
|
|
Заблокирован
|
|||||
| 30.03.2024, 22:32 [ТС] | |||||
![]()
Возможно, я не так понял. Там есть ещё примечание.
Возможно, я не так понял. Буду рад, если это так. Тогда проще жить!
1
|
|||||
|
Модератор
|
||
| 30.03.2024, 23:09 | ||
|
Очень приблизительно: 1) Есть некий флаг в Москве и его дубли в регионах; 2) Когда в регионе флаг подымается/опускается - посылается письмо в Москву произвести там тоже действие; 3) Когда надо в регионе определить состояние флага - то посылается письмо в Москву и там отвечают. Добавлено через 4 минуты Решили поднять Флаг на Камчатке и послали письмо в Москву. Письмо идёт в Москву неделю. А через два дня в Рязани решили проверить состояние флага. Письмо идёт в Москву за день. И там отвечают что флаг опущен, хотя на Камчатке его уже подняли и они считаю, что по всей стране уже подняли. Добавлено через 9 минут Локирование же это такой процесс: 1) Прежде чем узнать/изменить состояние флага - посылается письмо-запрос в Москву; 2) В Москве очередь писем с запросами. Берут первое из очереди и по нему отвечают "Начинайте действовать". Все остальные запросы отстаются ждать в очереди; 3) В регионе получили разрешение. После этого посылают в Москву письмо сообщить или изменить состояние; 4) Когда для региона станет неважен Флаг, посылают письмо об этом; 5) Когда получили от региона письмо о завершении работы с флагом - берут следующий запрос из очереди. В этой схеме гарантированно после изменения состояния флага, по всем последующим запросам будет правильный ответ. Но, во-первых,это многократно затратнее по времени. Если учитывать время ожидания в очереди, то в десятки-сотни-тысячи раз. Во-вторых, здесь вместо гонки изменить-узнать, получаем гонку запросов. Запрос отправленный позже из ближайшего региона попадёт в очередь раньше чем из дальнего.
1
|
||
|
Заблокирован
|
||
| 31.03.2024, 09:38 [ТС] | ||
|
Собственно, в материалах по параллельному программированию всегда по 10 раз пишут одно и то же - старайтесь, чтобы обрабатываемые параллельные процессы не использовали общих данных. Чтобы изначально уйти от источника проблем.
0
|
||
|
Модератор
|
||
| 31.03.2024, 10:25 | ||
|
Всё зависит от условий конкретной задачи. Так как, то что подразумевается под синхронизацией зависит от конкретного задания. Точное совпадение по таймингам в разных потоках - это исключительно редкое условие. Оно больше свойственно каким-то реалтайм системам, чем обычной обычному DeskTop под Виндой. Под Виндой для мультипотока почти всегда требуется обеспечение потокобезопасности при работе с данными. Условно: считал значение X, произвёл какие-то вычисления, записал новое значение X. И здесь требуется гарантировать, что значение X не будет изменяться из другого потока на время этих действий. Или считываешь коллекцию (в том числе байты Double) и нужно гарантировать, что в процессе считывания не никто не меняет эту коллекцию. Чтобы не получить, например для Double, первые байты от одного значения, а последние от другого. Точная синхронизация по времени, если нужно, осуществима, но это всегда "дорого".
0
|
||
|
Заблокирован
|
||
| 31.03.2024, 11:12 [ТС] | ||
|
Моя последняя формулировка тоже не верна? Я потом привел ссылки.
0
|
||
|
Модератор
|
|||||
| 31.03.2024, 12:04 | |||||
|
Главный вопрос "что считать последующем по времени"?Если приход сообщений в какой-то узел (как я описывал выше в Москву) - то гарантирует. Если отправку сообщений - то нет. Volatile - это всего лишь отправка сообщений "в центр". Функции синхронизации времени между потоками его методы не имеют. Interlocked - это про атомарность, а не про синхронизацию времени между потоками. То есть что бы пока считываешь первый байт Double, другой поток не изменил последний байт Double. Потокобезопасных коллекций - это про потокобезопасность работы с коллекцией, а не про синхронизацию времени между потоками. В некоторых реализациях так же включена и возможность синхронизации, но это не обязательно. Мютекс, lock и т.п. - это уже действительно про синхронизацию. Но все они дорогие.
1
|
|||||
|
Заблокирован
|
||||||
| 31.03.2024, 13:11 [ТС] | ||||||
|
Да, всё не просто.
. Да. Понятно. В общем нужно знать как это всё работает на низком уровне. А на низком уровне всё определяется системой и ещё ниже особенностями устройства процессора.Тут прямо пишут, что синхронизации нет:
Но ниже в примечании такой текст:
??? и что в итоге??? (и даже ссылка у них работает не правильно! - попадаем на начало статьи )![]() В общем, похоже, что стране нужен герой, который в одном связном тексте кратко опишет все аспекты применения этих инструменты атомарности и синхронизации с учетом конкретного физического устройства процессоров. И всё это с учетом того что актуально на сегодняшний день. И в плане процессоров и в плане инструментов. Исторический аспект (не актуальные инструменты и старые процессоры и т.п.) лучше вынести в некое приложение. ![]() Добавлено через 2 минуты А так. Слишком много "Но". И слишком много противоречий в текстах и мнениях. Добавлено через 10 минут
0
|
||||||
| 31.03.2024, 13:11 | |
|
Помогаю со студенческими работами здесь
40
Ошибка: error LNK2001: unresolved external symbol "double __cdecl Akk(double,double,double)" Отметьте 3 ошибочных объявления переменной типа double, Double Отметьте 3 ошибочных объявления переменной типа double, Double Перегрузите метод f так, чтобы соответствовала виду static void f (double x, out double y)
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|