|
7 / 7 / 4
Регистрация: 07.07.2011
Сообщений: 583
|
||||||
lock в условие или в цикле09.12.2019, 08:48. Показов 5681. Ответов 72
Здравствуйте. Как известно одна переменная в разных потоках требует блокировки, иначе результат изменения переменной будет не предсказуемый. Но если в одном потоке переменная (например) bool меняется, а во втором только проверяется, то обязательно ли блокировать изменение переменной или это лишнее? Если bool меняется асинхронно в обоих потоках, то да-надо. Но если меняется только в одном, а во втором просто проверяется или в if() или в while, то зачем что то блокировать?
0
|
||||||
| 09.12.2019, 08:48 | |
|
Ответы с готовыми решениями:
72
Acer aspire 5552G-N974G64Mikk Проблема с Caps Lock, Num Lock, Scroll Lock
Клавиатура мигает всеми тремя индикаторами Caps Lock, Scroll Lock и Num Lock и соответственно не работает! |
|
Модератор
|
||
| 09.01.2022, 20:35 | ||
|
Каждый компилятор может по своему оптимизировать код и даже один и тот же компилятор можно настраивать по разному. Вы можете в Студии залезть в настройки Release (правда не помню куда именно) и изменить применяемую в этом режиме оптимизацию. Но вопрос в этой теме другой. Он о защите переменной при её изменении. Допустим, если вы создадите поле decimal и будете его менять одновременно из множества потоков, то вы в какой-то моент можете получить в нём значение которого нет ни в одном из потоков. Один поток запишет первые 8 байт, другой вторые 8 - и получится неизвестно что. С int такого на x86 и x64 невозможно. С long такое возможно на x86. Вот именно это и является следствием атомарности или её отсутствия. В реальных приложениях на такое можно напороться, хотя и очень редко. И, конечно, в реале для обеспечения потокобезопасности всегда используют локировку. Не сколько из-за этих нюансов, сколько из-за того что обычно надо обеспечивать потокобезопасность не только одной команды/операторы, а какой-то их группы.
1
|
||
|
Модератор
|
|||||||
| 09.01.2022, 20:39 | |||||||
|
И всё заработает как надо:
1
|
|||||||
|
109 / 52 / 16
Регистрация: 09.06.2021
Сообщений: 480
|
|||
| 09.01.2022, 20:44 | |||
|
0
|
|||
|
Модератор
|
||
| 09.01.2022, 21:04 | ||
|
По спеку код компилируется так чтобы его логика не нарушалась в однопоточном исполнении. Для гарантировано правильной работы в многопотоке все нюансы этого разработчик должен учитывать самостоятельно.
1
|
||
|
109 / 52 / 16
Регистрация: 09.06.2021
Сообщений: 480
|
||||
| 09.01.2022, 21:13 | ||||
|
Элд Хасп, ни чего не понял.
0
|
||||
|
Модератор
|
|||||||||
| 09.01.2022, 22:07 | |||||||||
|
Компилятор должен работать правильно в рамках спека. Там где спеком что-то не оговорено, компилятор свободен в своих действиях. Конечно какую-то откровенную ахинею разработчики не вставят в компилятор. Они его не для шарад делают, а для реального использования. Но есть много не однозначных моментов, которые разные разработчики могут посчитать правильным решить по разному. Допустим, возвращаясь к предыдущему примеру, есть код метода:
Ведь никаких указаний на то, что здесь будет использована многопоточность нет. Надо предположить, что возможно она кому-то приспичит и метод оптимизировать под многопоточность, но при этом для однопотока он не будет оптимальным? Спеком оговорено только то, что логика метода после компиляции не должна изменяться. Но к этой логике относится же только сам метод, а он выполнятся в одном потоке. Поэтому и получается, что спеком оговорена работа компилятора только для однопотока. Если метод предполагается использовать в многопотоке, то надо как-то сообщить об этом компилятору. И как видели, даже пустого лок в теле метода хватает чтобы компилятор понял какую оптимизацию надо применить в этой части кода. Добавлено через 13 минут Компилятор это не волшебная палочка. Он компилирует код в меру того насколько может его понять. И да, в каких-то случаях вы можете получить разную реальную работу для одного и того же кода и тем не менее это будет всё в рамках спека, Поэтому в областях чётко не оговоренных спеком, требуется очень хорошее понимание не только самого Шарпа, но и конкретной среды его разработки и применения. Кроме самого спека есть ещё различные рекомендации по реализации тех или иных задач. Они появились не на пустом месте. И если разработчики .Net (то есть MS) дают какую-то рекомендацию, то следует её исполнять. Допустим, для отмены задачи следует использовать специальный токен, нежелательна зависимость исполняемого в задаче кода от изменения внешних переменных и т.д. и т.п.
0
|
|||||||||
|
109 / 52 / 16
Регистрация: 09.06.2021
Сообщений: 480
|
||||
| 09.01.2022, 22:24 | ||||
|
0
|
||||
|
Модератор
|
||||
| 09.01.2022, 22:34 | ||||
|
Вы вполне можете отключить оптимизацию при компиляции и будет получать код максимально соответсвующий пошаговому исполнению инструкций Шарп. Но такой код будет работать медленнее. Запрет - это получение неработающего кода. Запреты это область ошибок компиляции и исключений. Но не соблюдая рекомендаций вы можете получить код работающий, но не так как вам нужно.
0
|
||||
|
109 / 52 / 16
Регистрация: 09.06.2021
Сообщений: 480
|
|||
| 09.01.2022, 22:51 | |||
|
0
|
|||
|
Модератор
|
|
| 09.01.2022, 23:38 | |
|
Fylhtq05, у меня нет цели изменить спек, компилятор или переубедить вас.
Я вам только объясняю как всё устроено, и на мой взгляд это довольно логично. Какого-то предмета спора я здесь не вижу. Вот так вот оно устроено. Если вы считаете это нелогичным, то вы можете написать свои правки и отправить их разработчикам. Или забить на это и принять логику разработчиков.
0
|
|
|
109 / 52 / 16
Регистрация: 09.06.2021
Сообщений: 480
|
|||
| 10.01.2022, 11:47 | |||
|
0
|
|||
|
Модератор
|
|||
| 10.01.2022, 12:43 | |||
|
Там где нужна синхронизация значений между потоками в документации написано:
По объёму кода он отличается в полтора раза. По скорости возможно даже больше. Прокидывание изменений между потоками это дорогое удовольствие. И в >99% методах это не нужно. Стоит ли специально замедлять все методы чтобы получить "выигрыш" в очень редких задачах?
1
|
|||
|
109 / 52 / 16
Регистрация: 09.06.2021
Сообщений: 480
|
||||
| 10.01.2022, 13:17 | ||||
|
Про volatile я писал lock в условие или в цикле kolorotur говорит, что volatile проблему не решит, еще раз привожу цитату:
0
|
||||
|
Модератор
|
||
| 10.01.2022, 13:42 | ||
|
Fylhtq05, и для ясности.
Использование локов для принудительной ревалидации поля - это тоже не гарантия. По сути это просто недокументированная фича, которая принуждает текущую версию, конкретно этого компилятора, по другому оптимизировать код, Нет никакой гарантии, что это будет работать в другом компиляторе или в этом же, но в другой версии. Добавлено через 12 минут Изначально в этой теме никакой речи о кешировании между потоками не шло. Речь шла об обязательности лакирования переменных простого типа для того чтобы обеспечить её предсказуемое значение. В рамках этого вопроса и были мои ответы. Потом вы подняли вопрос о кешировании, что опять таки в рамках этого вопроса не имеет значения. Потом уже подтянули вопросы из своей второй темы, и добавили к ним дополнительные. В результате всё это переросло уже в синхронизацию переменной изменяемой в разных потоках. Может в вашем представления это всё одно и тоже. Но в моём это, хоть и где-то связанные темы, но все же это разные темы. И даже одни и те же термины в них означают разные понятия. Допустим, вы упоминали кеширование в регистрах. Это кеширование не имеет никакого отношения к "кешированию" из-за отсутствия синхронизации между потоками. Во втором случае, это даже кешированием назвать можно только условно. Добавлено через 6 минут Да, и по сути вопроса в этой теме, как я уже ответил выше, влияние локирования на синхронизацию переменной простого типа является недокументированной фичей. Поэтому прямой ответ на вопрос обязательно ли блокировать изменение переменной или это лишнее? - нет не обязательно.Если вопрос изменить на: Нужно ли для синхронизации переменной простого типа между потоками её локировать?.- В данной версии компилятора достаточно даже пустого лока перед валидацией переменной. Но это недокументированная фича. И в общем случае для гарантированно правильной работы "всегда и всюду" следует вместо локирования использовать специально предназначенные для этого инструменты.
0
|
||
|
Модератор
|
||
| 10.01.2022, 13:50 | ||
|
Образно. В 99% задач это, вообще, не нужно. Из оставшегося 1% в 99% случаев этого будет достаточно. Но остаётся ещё 0.01% задач в которых нужна более тщательная реализация этих моментов. Не забывайте, что Шарп задумывался как многоплатформенный инструмент, он должен работать и в системе на одном 8-битовом процессоре и в каком-то сервере с тысячами процессоров. И то что какой-то подход будет работать конкретно на вашем компе (условно) не значит, что это будет работать на всех других возможных конфигурациях. А в отношении многопоточности это воще жуть. Она даже на физическом уровне на разных платформах реализована очень по разному.
0
|
||
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
||
| 10.01.2022, 14:10 | ||
|
Если вкратце, то блок lock создает такую критическую точку, в которой наблюдаемые эффекты должны быть синхронизированы по времени, т.е. если какой-то другой поток изменил некий участок памяти, в блоке lock эти изменения обязаны быть наблюдаемыми.
1
|
||
|
109 / 52 / 16
Регистрация: 09.06.2021
Сообщений: 480
|
||||||
| 10.01.2022, 14:15 | ||||||
|
А на заданный в последнем топике вопрос можете поподробнее ответить?
0
|
||||||
|
Модератор
|
|||
| 10.01.2022, 14:21 | |||
|
Не могли бы дать ссылку - беглый поиск не дал результатов.
0
|
|||
|
Модератор
|
||
| 10.01.2022, 14:23 | ||
|
А в том, что я отвечал на одни вопросы, а вы эти ответы "натягиваете" на другие вопросы. Я же не телепат и не могу знать из какой-темы появились ваши вопрос и в каком контексте они заданы.
0
|
||
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
||
| 10.01.2022, 14:44 | ||
|
Элд Хасп, в принципе, раздел 3.10 неплохо все суммирует:
1
|
||
| 10.01.2022, 14:44 | |
|
Работа с клавиатурой (клавиши num lock, caps lock, scroll lock) Оптимизирует ли компилятор выражения в цикле типа 90*M_PI или каждую итерацию в цикле считает заново? Горят лампочки caps lock и num lock, ноутбук не включается Условие в цикле
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
| Опции темы | |
|
|
Новые блоги и статьи
|
|||
|
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
|
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет:
1. Использовать системное время и дату,
2. Есть возможность вводить время и дату вручную.
3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
|
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber.
Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
|
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео:
https:/ / vkvideo. ru/ video-240781534_456239017
YouTube:
eY5-5PyI9NM
Текстовая версия
|
|
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать
Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
|
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства.
Родственных связей существует 8 ступеней, такие как:
p - отец
P - мать
q - муж
Q - жена
b - брат
B - сестра
s - сын
S - дочь
|
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире.
Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
|
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С.
Задача:
Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
|