|
Заблокирован
|
|
Метод Interlocked.Exchange(Double, Double) не гарантирует одинаковое значение переменной в разных потоках?20.03.2024, 13:45. Показов 2566. Ответов 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 |
|
Администратор
|
||||||
| 20.03.2024, 14:53 | ||||||
Сообщение было отмечено titan4ik как решение
Решение
1
|
||||||
|
Заблокирован
|
||||
| 20.03.2024, 15:18 [ТС] | ||||
|
lock тоже просто защищает некий операцию с неким общим ресурсом от вмешательства других потоков. Не нашел пока исчерпывающего и однозначного достоверного источника по этому вопросу.
0
|
||||
|
4693 / 2701 / 734
Регистрация: 02.08.2011
Сообщений: 7,227
|
||
| 20.03.2024, 15:23 | ||
Сообщение было отмечено titan4ik как решение
Решение
1
|
||
|
Заблокирован
|
|||
| 20.03.2024, 15:26 [ТС] | |||
|
Ну да. Пишут что "The following code example shows a thread-safe resource locking mechanism." Это я, видать, не дочитал сразу ![]() Сбивают с толка пространные рассуждения в интернете по этому поводу. Пишут так, что можно понять, что это не жёстко определено, а может быть и так и эдак в зависимости от внешнего окружения. Добавлено через 1 минуту ОК, я понял, что Interlocked-методы обеспечивают потокобезопасность без всяких оговорок. Спасибо!
0
|
|||
|
4693 / 2701 / 734
Регистрация: 02.08.2011
Сообщений: 7,227
|
||
| 20.03.2024, 15:34 | ||
|
1
|
||
|
Заблокирован
|
|
| 20.03.2024, 15:40 [ТС] | |
|
Чтобы вбить последний гвоздь в...
Не будет глупостью такой код в котором некий кусок кода заблокирован с помощью lock, а внутри него некоторые отдельные операции защищены ещё и с помощью методов Interlocked?
0
|
|
|
4693 / 2701 / 734
Регистрация: 02.08.2011
Сообщений: 7,227
|
||
| 20.03.2024, 15:56 | ||
![]() Добавлено через 2 минуты Лучше уж только Interlocked, без всяких lock-ов. Интуитивно кажется легче/быстрее. Если весь упор делать на perf, в моем понимании.
1
|
||
|
Заблокирован
|
|
| 20.03.2024, 16:05 [ТС] | |
|
0
|
|
| 20.03.2024, 16:12 | |
|
Не по теме: titan4ik, сокращение от performance. Когда много буржуйских буков читаешь, иногда русский эквивалент кажется менее точным и неподходящим, поэтому хочется англоязычную терминологию использовать. К тому же так сильно короче. Это как Solution и Решение.
0
|
|
|
Заблокирован
|
|
| 20.03.2024, 16:17 [ТС] | |
|
Не по теме: ну да, буржуйские лучше, чем калька на русском Добавлено через 2 минуты Но как я понял, отличие Interlocked и всяких lock-ов не только в производительности. lock же не обеспечит того, чтобы во всех потоках переменная имела одно значение. Этот же вопрос главный был. Меня конкретно тип Double интересовал.
0
|
|
|
|
||
| 20.03.2024, 16:21 | ||
|
1
|
||
|
4693 / 2701 / 734
Регистрация: 02.08.2011
Сообщений: 7,227
|
||
| 20.03.2024, 16:26 | ||
|
Если будет high contention (погнали по-полной!), то будут задержки со входом в критическую секцию и будет пустое расходование ресурсов, при spin-based примитивах будет уже быстрее, но будет много холостой работы процессора, и тут уже надо думать что использовать под конкретный сценарий. Вы слишком рано зациклились на кешах, как мне кажется. Такие вещи надо исследовать benchmark-ами, которые еще надо правильно написать, чтобы увидеть разницу.
1
|
||
|
Заблокирован
|
||
| 20.03.2024, 16:30 [ТС] | ||
|
Andrey-MSK, в рамках изначальной постановки вопроса (для Double, в частности) я понял, что можно и нужно использовать методы Interlocked.
Добавлено через 3 минуты
0
|
||
|
4693 / 2701 / 734
Регистрация: 02.08.2011
Сообщений: 7,227
|
||
| 20.03.2024, 16:44 | ||
- все примитивы синхронизации как раз были придуманы для того, чтобы обеспечить предсказуемое поведение чтения/записи шареных состояних в многопоточном окружении. Если следовать вашей логике, то раз у нас есть регистровый кэш, то ни один Semaphor/Mutex/Barrier/что-там еще/... нам не поможет, поэтому у нас лапки и это все бесполезно.Насколько я понимаю, c Interlocked и volatile можно работать. Вообще рекомендую почитать статейку, старую, но все же это база - C# Memory Model by Igor Istrovsky.
1
|
||
|
Заблокирован
|
||
| 20.03.2024, 20:30 [ТС] | ||
|
0
|
||
|
Заблокирован
|
|
| 21.03.2024, 13:48 [ТС] | |
|
Не по теме: Прочитал первую и просмотрел вторую. Мда. В связи с многопоточностью и т.п. появилось конкретное соображение относительно прав собственности и их смены. Сейчас отменены "Свидетельства о праве собственности". есть только записи в реестре (в компутере). Можно получить выписку из реестра (компутера). При сделках с недвижимостью требуют "свежую" выписку. Но какой бы свежей она ни была, это не гарантирует того, что после получения этой выписки, недвижимость уже была продана. Предлагаю ввести блокирующую выписку! То есть, перед сделкой продавец должен получить выписку, которая на определенный срок (например, на 10 дней) блокирует все сделки с этой недвижимостью за исключением продажи данному конкретному покупателю, о чем и будет указано в этой выписке.
0
|
|
|
1152 / 860 / 263
Регистрация: 30.04.2009
Сообщений: 3,603
|
|||||||||||||||||||||
| 27.03.2024, 02:08 | |||||||||||||||||||||
Сообщение было отмечено titan4ik как решение
Решение
Читал по диагонали, не знаю к чему таки пришли, но рассуждения что Interlocked отменяет необходимость использования volatile по моему скромному мнению неверно.
Для вызова самого Interlocked.Exchange volatile не нужен, потому как все Interlocked методы и так оборудованы необходимым механизмом обеспечивающим работу с наиболее актуальной версией значения переменной, если можно так выразиться) Для других же мест где производится просто чтение переменной и где необходима гарантия получения наиболее актуального значения, нужен один из приемов который под капотом так или иначе использует Thread.MemoryBarrier(). А именно 1. Обозначение поля как volatile
Минусы - все попытки чтения будут включать вызов Thread.MemoryBarrier(), а это доп издержки которые не всегда нужны. 2. Оборачивание чтения в конструкцию lock
Минусы - это как из пушки по воробьям. lock вызывает метод ядра, а это очень дорогая операция (тысячи тактов если не ошибаюсь) 3. Доступ через Volatile.Read
Минусы - нет. 4. Собственно вызов Thread.MemoryBarrier().
Минусы - может ввести в ступор большинство погромистов, повышен риск что непонятный код будет удален после короткого тестирования и подтверждения что "все и так работает нормально".
2
|
|||||||||||||||||||||
|
Заблокирован
|
|
| 27.03.2024, 09:10 [ТС] | |
|
nicolas2008,
то есть, если расположить способы в таком порядке, что сначала лучшие, то так (?): №3 - минусов нет №1 - Минусы - все попытки чтения будут включать вызов Thread.MemoryBarrier(), а это доп издержки которые не всегда нужны. №4 - Thread.MemoryBarrier(), а это доп издержки которые не всегда нужны и может ввести в ступор большинство погромистов, повышен риск что непонятный код будет удален после короткого тестирования и подтверждения что "все и так работает нормально". №2 - Минусы - это как из пушки по воробьям. lock вызывает метод ядра, а это очень дорогая операция (тысячи тактов если не ошибаюсь) --- Тогда лучший рецепт - Interlocked для изменения плюс Volatile.Read для чтения?
0
|
|
| 27.03.2024, 09:10 | |
|
Помогаю со студенческими работами здесь
20
Ошибка: 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 .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|