|
7 / 7 / 4
Регистрация: 07.07.2011
Сообщений: 583
|
||||||
lock в условие или в цикле09.12.2019, 08:48. Показов 5492. Ответов 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, ноутбук не включается Условие в цикле
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
После бана на Пикабу не работает авторизация аккаунта с Яндекса.
Hrethgir 09.07.2026
В частности https:/ / auto. ru/ logbook/ zapret-na-vozhdenie-posle-65-let_1cf28789-07b4-4c75-a2f7-4cd4edf9deeb тут хотел оставить комментарий такой
Зрите в корень - монополизация на разработку программ. . .
|
GitDOS: Когда я решил скрестить MS-DOS, GitHub и Claude
MaGz GoLd 08.07.2026
Привет, Киберфорум! Хочу поделиться своим проектом, который, надеюсь, вас заинтересует. GitDOS — это веб-приложение, которое позволяет запускать DOS в браузере с тремя крутыми фичами: диски живут в. . .
|
Учебный мини "цифровой двойник" = (Сервер = Java + Flask_питон )+(3D = Гугловскаая 4T nvideo + google colab) +( WMS = Odoo на Docker)
anaschu 07.07.2026
Увидел в требованиях к вакансии создателя имитационных моделей связку (REst + Api + WMS + Anylogic + питон + 3D Nvideo), и решил посмотреть, что это такое. Из этого всего я работал более менее. . .
|
Море в объективе
kumehtar 06.07.2026
Хотел написать много проникновенных слов, но передумал.
Оно само - говорит.
Кто слышит тот слышит.
|
|
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было
ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась.
Первый вариант. . .
|
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2.
Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
|
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет.
Но обычно это 50 лет и более.
Наверное, закисление почвы происходит сезонно в средней. . .
|
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
|