|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|
Синхронизация доступа к разделяемой памяти21.02.2017, 12:08. Показов 12463. Ответов 73
Метки нет (Все метки)
Когда потоки являются дочерними по отношению к процессу тут все просто - объект мьютекса находится в общей памяти и используя этот объект можно делать mutex.lock() определенной секции а при завершении работы mutex.unlock();
А как синхронизировать доступ к данным shared memory между процессами? Подозреваю что в таком случае мьютекс нужно хранить разделяемой памяти Но как конкретно это реализуется плохо представляю Подскажите пожалуйста кто знает
0
|
|
| 21.02.2017, 12:08 | |
|
Ответы с готовыми решениями:
73
Реализация стека строк в разделяемой памяти (MPI)
Есть ли оверхед от использования разделяемой памяти, в сравнении с глобальной? |
|
|
|||
| 22.02.2017, 11:52 | |||
|
1
|
|||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
||
| 22.02.2017, 12:03 [ТС] | ||
|
0
|
||
|
|
||
| 22.02.2017, 12:12 | ||
|
В изначальных редакциях языков не было никакого понятия многопоточности и прочего. Я не знаю тонкостей стандартов, но скорее всего везде описывается программная модель, соответствующая однопоточной в нашем понимании. Т.е. в языке есть просто указатель, но нет таких понятий, как "указатель на память, доступную из других мест". Косвенно такие понятия реализуются через volatile, но концепция volatile - это одно из гнилых мест стандарта, про который до сих пор у различных разработчиков нет общего и чёткого понимания. Не говоря уж о том, что это слишком консервативно Про то, чем различается реализация различных семантик на пальцах я объяснял здесь: Std::atomic. Реализация свободного от блокировок стека И такие понятия вводятся в язык через более высокоуровневые конструкции (типа класса std::atomic в C++)
1
|
||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|||
| 22.02.2017, 12:37 [ТС] | |||
|
Спасибо
0
|
|||
|
|
||
| 22.02.2017, 13:20 | ||
|
0
|
||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
||
| 22.02.2017, 13:27 [ТС] | ||
|
Странно что такие гарантии не даются
0
|
||
|
|
||
| 22.02.2017, 13:59 | ||
|
C void foo (int *p) { *p = 0; }
1
|
||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|
| 22.02.2017, 16:10 [ТС] | |
|
0
|
|
|
|
||
| 22.02.2017, 16:29 | ||
|
В конечном итоге поток1 вызовет интерфейс "освободить мьютекс". Внутри этой функции проверяется очередь и первый из очереди (а нашем случае это поток2) будет разбужен через тот же самый системный вызов futex (т.е. поток1 отдаёт ядру приказ "разбудить поток2"). При этом сам мьютекс останется в состоянии "занято". После чего поток1 выйдет из этого интерфейса и продолжит работу. Разбуженный поток2 выполняет действия в критической секции и вызовет интерфейс "освободить мьютекс". В процессе этого ядру будет отдан приказ "разбудить поток3", а сам мьютекс по прежнему останется в состоянии "занято". Поток2 продолжает свою работу, а поток 3 просыпается и так далее. Когда в конечном итоге поток3 вызовет интерфейс "освободить мьютекс", то очередь опустеет, после чего будить будет некого. Тогда мьютекс переведётся в состоянии "свободно"
1
|
||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|
| 22.02.2017, 16:39 [ТС] | |
|
Evg,
Интересно Но lock-free который мы обсуждали прежде по любому выигрывает у этого мьютекса1. Нет системных вызовов 2. Если захват недоступен можно выполнять другую полезную работу
0
|
|
|
|
||
| 22.02.2017, 16:49 | ||
|
Термином lock-free называют несколько другую вещь (или даже свойство)
Добавлено через 1 минуту Точнее, в вашей реализации была операция lock, она реализована в виде жужжания. Я уже писал ранее, что она имеет ограниченое применение. То, что вы реализовали, по сути является понятием "spinlock"
0
|
||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
||||
| 22.02.2017, 17:14 [ТС] | ||||
Lock-free насколько мне известно это просто принцип синхронизации доступа на основе атомарных операций, обычно это CAS. Не знаю, может существуют и другие подобные операции
0
|
||||
|
|
|
| 22.02.2017, 19:11 | |
|
Нет. Lock-free - это свойство атомарного примитива, говорящее о том, что ВНУТРИ СЕБЯ примитив реализован без использования дополнительных объектов синхронизации, а использует исключительно аппаратную поддержку. Вы использовали метод (примитив) compare_exchange_weak, который сам по себе в общем случае может быть реализован как угодно, в том числе содержать мьютексы или что-то подобное (т.е. имитирует атомарность). Если такой примитив (compare_exchange_weak или любой другой) реализован аппаратной операцией, то говорят, что это Lock-free примитив. Т.е. при любых внешних условиях примитив либо гарантированно выполнится, либо гарантированно не выполнится, никаких промежуточных состояний быть не может. Но вот если внутри реализации использован мьютекс, то тут возможно промежуточное состояние. Т.е. примитив при своей работе захватил мьютекс (я говорю именно о внутреннем мьютексе реализации примитива, а не о пользовательском мьютексе, который реализуется через примитив), а потом по каким-то причинам процесс сдох, повис или что-то подобное. Это приведёт к Dead-lock'у. Для примитивов, обладающих свойством Lock-free, Dead-lock невозможен
1
|
|
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
||||||||||||
| 23.02.2017, 10:12 [ТС] | ||||||||||||
|
Renji,
Синхронизация доступа к разделяемой памяти Представим ситуацию из следующего примера: 1. Процесс пробился через флаг и пошел работать сделав состояние флага снова "занято" 2. Этот самый процесс сдох по каким то причинам не добравшись до memory_order_release 3. Состояние флага остается "занято" Выходит при таком раскладе событий этот участок больше ни кем не может быть выполнен? Как это называется и разруливается? Дедлок насколько я понимаю это когда два или более задания держат блокировку на ресурсы которые нужны и одному, а этот самый "одному" держит блокировку на тот ресурс который нужен другому Вопрос навеян постом #54 (там где про дедлоки) Добавлено через 14 минут Добавлено через 32 минуты Renji, Вот еще что интересно. Что бы этот флаг был виден в процессах его нужно сохранить в шаред мемори но тут я не вижу соответствующего конструктора который принимает флаг http://en.cppreference.com/w/c... tomic_flag Однако инициализация происходит успешно если написать так:
0
|
||||||||||||
|
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
|
||||
| 23.02.2017, 11:59 | ||||
|
1) Процесс подключается к серверу базы данных и инициирует начало транзакции. 2) Спустя, скажем, десять секунд сервер решает "чего-то долго ждем, наверно, процесс сдох" и откатывает транзакцию. Но нужно пилить поддержку транзакций и, собственно, сервер базы данных. И тут уже в полный рост встает вопрос зачем все это пилить, вместо того чтобы взять готовую СУБД. Добавлено через 1 минуту
1
|
||||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
||
| 23.02.2017, 12:05 [ТС] | ||
|
Renji,
Не очень понял как СУБД связана с данной проблемой. Или это был просто пример? Пока думаю решить так: запускать фоновый процесс который проверяет жив ли процесс который в последний раз захватил блокировку, если время захвата более чем нас устраивает, в этом процессе сделать release флага и дать возможность продолжить работу другим потокам и откатить изменения сделанные уже мертвым процессом в общей памяти Добавлено через 1 минуту
0
|
||
|
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
|
||||
| 23.02.2017, 12:10 | ||||
|
1
|
||||
|
|
|||
| 23.02.2017, 12:12 | |||
|
Твоя ситуация. Кто-то захватил мьютекс и сдох. Программа-диспетчер увидела, что сдох процесс, который захватил мьютекс, процесс прибила, мьютекс освободила. При этом в непонятном состоянии оказались данные Моя ситуация. Кто-то начал захватывать мьютекс (который является non-lock-free) и сдох. Т.е., грубо говоря, речь идёт о мьютексе, работоспособность которого изнутри обеспечивает другой мьютекс. В этом случае в непонятном состоянии находится мьютекс - непонятно, он открыт или закрыт. Т.е. другие процессы, которые хотят захватить мьютекс, даже не в состоянии понять, свободен мьютекс, или занят Вот примерно такая разница между примтивами lock-free и non-lock-free. Примитив - это грубо говоря операции compare_exchange_weak, посредством которых реализуется мьютекс. Lock-free примитив compare_exchange_weak гарантирует, что в процессе его работы значение переменной будет либо гарантированно старым, либо гарантированно новым. В то время как не-lock-free примитив такого гарантировать не сможет. В случае, если в процесс работы примитива что-то случится, то значение переменной может оказаться в промежуточном неизвестном состоянии
0
|
|||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
||||
| 23.02.2017, 12:15 [ТС] | ||||
|
Я почему интересуюсь решением без СУБД... есть ведь lock-free контейнеры которые работают без СУБД. Они же как то справляются только за счет алгоритма... Вот мне интересно как это реализуется. Мне пока нужно просто понять идею что бы легко читать сложные исходники
0
|
||||
| 23.02.2017, 12:15 | |
|
Аська на основе разделяемой памяти Запись и считывание разделяемой памяти Хранение указателей в разделяемой памяти Считать структуру из разделяемой памяти Сделать массив из 10 int в разделяемой памяти Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
|
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#.
Название изменил на ColorStep.
Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
|
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами:
- ВидТО (СправочникСсылка. ВидыТО);
- ВидГСМ. . .
|
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала.
Ниже прикреплён. . .
|
|
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F
Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU.
Опрашиваются регистры. . .
|
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка:
Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
|
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо
Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
|
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман.
Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
|