powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Concurrency Vs multithreading
25 сообщений из 130, страница 3 из 6
Concurrency Vs multithreading
    #38616590
DEVcoach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
no56892 DEVcoach ,
Кстати, Вы выдвигали версию о том, что это можно объяснить якобы "кэширванием в регистрах", дак вот, попробуйте затестить Ваш же пример с 17 переменными (целочисленных регистров AMD64 - 16).Ну напишите :-) А смысл этих мытарств в чем? Может это регистры, может JIT закэшировал значение в стэке, и не трогает хип. Может быть еще что-то. Прикладной ценности эти копания не имеют.
...
Рейтинг: 0 / 0
Concurrency Vs multithreading
    #38616625
0FD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DEVcoachВо-вторых, есть масса других способ заставить этот поток увидеть s=1. Например, как уже приводили выше пример, с помощью Thread.yield(). Как вы объясните, что видимость появляется в этом случае? Это нативный метод, к synchronization action не относится ... а видимость дает?

Не только yield, но и со sleep. Хотя jls 17.9 Sleep and Yield
...
It is important to note that neither Thread.sleep nor Thread.yield have any synchronization semantics. In particular, the compiler does not have to flush writes cached in registers out to shared memory before a call to Thread.sleep or Thread.yield, nor does the compiler have to reload values cached in registers after a call to Thread.sleep or Thread.yield.
...
...
Рейтинг: 0 / 0
Concurrency Vs multithreading
    #38616862
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
For AllВообще-то мгопоточность программировали ещё на 8086 процессоре (даже не 80186 и тем более задолго до появления 80286). CAS-операций в 8086 как известно нет. Как же они делали это?Насколько я помню, префикс lock был изначально. Более следующие процессоры просто ограничили его использование.
Плюс, Intel изначально реализовала "блокировку прерываний" для команд, меняющих SP. Именно для того, чтобы гарантировать атомарное переключение стека.
...
Рейтинг: 0 / 0
Concurrency Vs multithreading
    #38616879
For All
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovFor AllВообще-то мгопоточность программировали ещё на 8086 процессоре (даже не 80186 и тем более задолго до появления 80286). CAS-операций в 8086 как известно нет. Как же они делали это?Насколько я помню, префикс lock был изначально. Более следующие процессоры просто ограничили его использование.
Плюс, Intel изначально реализовала "блокировку прерываний" для команд, меняющих SP. Именно для того, чтобы гарантировать атомарное переключение стека.
Насколько я помню, на 8086 многопоточность делали без использования "блокировки прерываний". Тем не менее работало.
...
Рейтинг: 0 / 0
Concurrency Vs multithreading
    #38616885
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
For AllНасколько я помню, на 8086 многопоточность делали без использования "блокировки прерываний"Это вы так думаете.
Системный таймер (мегагерц с копейками поделённый на 64к) мог тикнуть в любое времяТем не менее работало.Оно потому и работало, что национальные особенности записи в SP обеспечивали беспроблемное переключение стека, а lock гарантировал работу семафоров. Если, конечно, они использовались.
...
Рейтинг: 0 / 0
Concurrency Vs multithreading
    #38616958
mesier
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл ник В этот раз соглашусь со свеномом, многопоточность сложная тема, и именно в деталях и терминах кроется дьявол. Так как примногопоточном программировании ошибку допустить проще простого, как раз таки понимание этих деталей и рулит. Не буду утверждать что я сам гуру, но множество приведенных вами неточностей позволяет сделать вывод про уровень ваших знаний, да, я бы взял вас в команду писать код, который просто работает в разных потоках, но я бы не взял вас в команду по написанию чего-то нового и нешаблонного(пока что). Вообще многопоточность такая штука, в которой просто необходима практика, практика и еще раз практика, а лучше всего пяток пофикшенных гейзенбагов :)
Именно так - практика! И как раз практики-то с многопоточностью у меня нет, и именно поэтому забылись детали теории (неиспользуемые знания забываются).
Таки куда приходить собеседоваться на позицию "писать код, который просто работает" ? )) Удалёнку рассматриваете?
Я как раз сейчас в поиске работы..
...
Рейтинг: 0 / 0
Concurrency Vs multithreading
    #38617341
For All
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovFor AllНасколько я помню, на 8086 многопоточность делали без использования "блокировки прерываний"Это вы так думаете.
Системный таймер (мегагерц с копейками поделённый на 64к) мог тикнуть в любое времяИ он тикал - прерывания же не блокировались. И клавиатура тикала по нажатию клавиши, и последовательные порты. Вообще все прерывания срабатывали.Basil A. SidorovТем не менее работало.Оно потому и работало, что национальные особенности записи в SP обеспечивали беспроблемное переключение стека, а lock гарантировал работу семафоров. Если, конечно, они использовались.lock - это блокировка шины на время выполнения команды, актуальна для многопроцессорных/многоядерных систем, и к реализации семафоров на процессоре 8086 (который не яляется многоядерным) не имеет никакого отношения.
...
Рейтинг: 0 / 0
Concurrency Vs multithreading
    #38617484
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
For AllBasil A. Sidorovпропущено...
Это вы так думаете.
Системный таймер (мегагерц с копейками поделённый на 64к) мог тикнуть в любое времяИ он тикал - прерывания же не блокировались. И клавиатура тикала по нажатию клавиши, и последовательные порты. Вообще все прерывания срабатывали.Basil A. Sidorovпропущено...
Оно потому и работало, что национальные особенности записи в SP обеспечивали беспроблемное переключение стека, а lock гарантировал работу семафоров. Если, конечно, они использовались.lock - это блокировка шины на время выполнения команды, актуальна для многопроцессорных/многоядерных систем, и к реализации семафоров на процессоре 8086 (который не яляется многоядерным) не имеет никакого отношения.
А что за lock? Разве одной команды? Я всегда думал, что именно чтобы несколько команд выполнить, так сказать транзакцию. А смысл что-то я непойму: на "электрическом уровне" тот-же "mov <something>, 0xadress" implicitly лочит шину или как?

А по поводу while(sharedobject.field == 0) { ... } я засабмитил баг в оракл, это ИМХО явный баг. Посмотрим результаты...
...
Рейтинг: 0 / 0
Concurrency Vs multithreading
    #38617500
For All
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
no56892А что за lock? Разве одной команды? Я всегда думал, что именно чтобы несколько команд выполнить, так сказать транзакцию. А смысл что-то я непойму: на "электрическом уровне" тот-же "mov <something>, 0xadress" implicitly лочит шину или как? lock - Assert LOCK# signal for the next instruction. The LOCK prefix causes the LOCK# signal to be asserted during execution of the instruction that follows it.
И ещё по поводу шины.
...
Рейтинг: 0 / 0
Concurrency Vs multithreading
    #38617516
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
For Allno56892А что за lock? Разве одной команды? Я всегда думал, что именно чтобы несколько команд выполнить, так сказать транзакцию. А смысл что-то я непойму: на "электрическом уровне" тот-же "mov <something>, 0xadress" implicitly лочит шину или как? lock - Assert LOCK# signal for the next instruction. The LOCK prefix causes the LOCK# signal to be asserted during execution of the instruction that follows it.
И ещё по поводу шины.
Это если одна шина на память и на IO устройства, а какой смысл в lock если сейчас в в процессоре как минимум одна шина на память и одна на IO ?
...
Рейтинг: 0 / 0
Concurrency Vs multithreading
    #38617534
For All
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
no56892А что за lock? Разве одной команды? Я всегда думал, что именно чтобы несколько команд выполнить, так сказать транзакцию. А смысл что-то я непойму: на "электрическом уровне" тот-же "mov <something>, 0xadress" implicitly лочит шину или как?no56892Это если одна шина на память и на IO устройства, а какой смысл в lock если сейчас в в процессоре как минимум одна шина на память и одна на IO ?
Например, команда add <something>, 0xadress с точки зрения шины не атомарна - там несколько общений к шине идёт. В многопроцессорной/многоядерной системе разные процессоры/ядра запросто могут обратиться в одну и ту же ячейку памяти (по одной и тоже шине на память) и поломать add друг-другу.
...
Рейтинг: 0 / 0
Concurrency Vs multithreading
    #38617600
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
For Allno56892А что за lock? Разве одной команды? Я всегда думал, что именно чтобы несколько команд выполнить, так сказать транзакцию. А смысл что-то я непойму: на "электрическом уровне" тот-же "mov <something>, 0xadress" implicitly лочит шину или как?no56892Это если одна шина на память и на IO устройства, а какой смысл в lock если сейчас в в процессоре как минимум одна шина на память и одна на IO ?
Например, команда add <something>, 0xadress с точки зрения шины не атомарна - там несколько общений к шине идёт. В многопроцессорной/многоядерной системе разные процессоры/ядра запросто могут обратиться в одну и ту же ячейку памяти (по одной и тоже шине на память) и поломать add друг-другу.
А, понял.
...
Рейтинг: 0 / 0
Concurrency Vs multithreading
    #38617807
Фотография k0rvin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл никне совсем, multithreading он же возможен и на одном ядре. Это способ разбить задачу на юниты, которые могут, но не обязаны выполняться параллельно.
Concurrency же рассматривает как раз вопросы параллельного выполнения, и возникающие в связи с этим сложности, видимость, целостность, и тд

В общем-то конкурентные программы могут работать в одном потоке, т.к. конкурентность часто обеспечивается "софтово" -- виртуальной машиной или рантаймом языка и не зависит от потоков/процессов ОС (но может их использовать).

Собственно вот.

Так что по сути разница между multithreading и concurrency только в реализации, а параллельные вычисления -- совсем другая тема.
...
Рейтинг: 0 / 0
Concurrency Vs multithreading
    #38617958
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
For Alllock - это блокировка шины на время выполнения команды, актуальна для многопроцессорных/многоядерных систем, и к реализации семафоров на процессоре 8086 (который не яляется многоядерным) не имеет никакого отношения.Мопвашуять ...
Вы постоянно игнорируете периферийное железо, которое сидело той же самой (общей) шине. Не процессором единым ...
...
Рейтинг: 0 / 0
Concurrency Vs multithreading
    #38686622
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DEVcoach Сказать, что volatile не кэшируются, хотя они кэшируются;


Можно отсюда поподробнее ?

Что происходит в тот момент, когда я пытаюсь считать волатильную перменную ?
У меня в каждом потоке свое закешированное значение волатильной переменной(непосредственно перед чтением), как они синхронизируются? Как выбирается самое актуальное значение?

P.S. я знаю, что volatile write happens-before volatile read
...
Рейтинг: 0 / 0
Concurrency Vs multithreading
    #38686645
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
redwhite90Что происходит в тот момент, когда я пытаюсь считать волатильную перменную ?
У меня в каждом потоке свое закешированное значение волатильной переменной(непосредственно перед чтением), как они синхронизируются? Как выбирается самое актуальное значение?
P.S. я знаю, что volatile write happens-before volatile read
Грубо говоря на пальцах это так: переменная - это значение в памяти. Кэш это регистр процессора. Обычную переменную можно не читать из памяти (долго), а прочитать из регистра (быстро). Чтение volatile переменной происходит из памяти. Поэтому там актуальное значение, а не из регистра, где может быть устаревшее.
...
Рейтинг: 0 / 0
Concurrency Vs multithreading
    #38686658
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

спасибо.

Получается, что при каждом изменении волатильной переменной она записывается в локальный кеш потока и в память.

P.S. Значит всё-таки "суперкопия" существует.
...
Рейтинг: 0 / 0
Concurrency Vs multithreading
    #38686661
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

ну и возникает вопрос, зачем вообще тогда кэшировать волатильные переменные?
...
Рейтинг: 0 / 0
Concurrency Vs multithreading
    #38686671
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
redwhite90Blazkowicz,

ну и возникает вопрос, зачем вообще тогда кэшировать волатильные переменные?
Зависит от алгоритма. Можешь кешировать. И ты получишь ретроспективноее ее представление.
Твой алгоритм будет быстр - но синхронен с "точкой времени в прошлом". По аналогии с курсорами
версионных СУБД. Ты не получаешь объективные данные. А ты получаешь данные на момент когда
открылся курсор (у тебя - начался твой АЛГОРИТМ).

Короче это algorithm depends.
...
Рейтинг: 0 / 0
Concurrency Vs multithreading
    #38686692
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonredwhite90Blazkowicz,

ну и возникает вопрос, зачем вообще тогда кэшировать волатильные переменные?
Зависит от алгоритма. Можешь кешировать. И ты получишь ретроспективноее ее представление.
Твой алгоритм будет быстр - но синхронен с "точкой времени в прошлом". По аналогии с курсорами
версионных СУБД. Ты не получаешь объективные данные. А ты получаешь данные на момент когда
открылся курсор (у тебя - начался твой АЛГОРИТМ).

Короче это algorithm depends.

в java я же не могу получить неактуальное значение волатильной переменой. И соответственно алгоритм свой написать не могу.
...
Рейтинг: 0 / 0
Concurrency Vs multithreading
    #38686695
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
redwhite90в java я же не могу получить неактуальное значение волатильной переменой. И соответственно алгоритм свой написать не могу.
Поэтому в Java, чтобы не изучать арихитектуру каждого CPU и особенности JIT компиляции под него, сделана единая JMM, на которую нужно ориентироваться.
...
Рейтинг: 0 / 0
Concurrency Vs multithreading
    #38686701
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

я наверное непонятно задаю вопрос.

Что поменялось бы если бы волатильная переменная не кешировалась бы? Есть хоть один кейс, когда используется значение волатильной переменной из кеша?
...
Рейтинг: 0 / 0
Concurrency Vs multithreading
    #38686705
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
redwhite90Что поменялось бы если бы волатильная переменная не кешировалась бы? Есть хоть один кейс, когда используется значение волатильной переменной из кеша?
С точки зрения Java - разницы никакой нет.
...
Рейтинг: 0 / 0
Concurrency Vs multithreading
    #38686706
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
redwhite90maytonпропущено...

Зависит от алгоритма. Можешь кешировать. И ты получишь ретроспективноее ее представление.
Твой алгоритм будет быстр - но синхронен с "точкой времени в прошлом". По аналогии с курсорами
версионных СУБД. Ты не получаешь объективные данные. А ты получаешь данные на момент когда
открылся курсор (у тебя - начался твой АЛГОРИТМ).

Короче это algorithm depends.

в java я же не могу получить неактуальное значение волатильной переменой. И соответственно алгоритм свой написать не могу.
Давай на конкретном случае. Если волатальная переменная - это статистический счётчик
который ты просто сыплешь в лог или кидаешь в интерфейсы мониторинга - это одно дело.

Если она - это аргумент алгоритма - то тебе придётся "сбрасывать" алгоритм и каждый раз
заново выполнять перерасчёт чтобы обеспечить актуальность. Отсюда вопрос. Зачем
вообще нужна эта "грязная" (dirty) волатальная перменная. Может лучше переписать код и организовать
events которые будут запускать другие потоки с актуальными аргументами?

Может с другой стороны подойти к синхронизации?

Может volatile это вовсе не тот философский камень который тебе нужен?
...
Рейтинг: 0 / 0
Concurrency Vs multithreading
    #38686728
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
redwhite90Что поменялось бы если бы волатильная переменная не кешировалась бы?Очевидно увеличится время получения значения из памяти
...
Рейтинг: 0 / 0
25 сообщений из 130, страница 3 из 6
Форумы / Java [игнор отключен] [закрыт для гостей] / Concurrency Vs multithreading
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]