|
1 / 1 / 1
Регистрация: 28.11.2010
Сообщений: 37
|
|
Синхронизировать процессы с помощью мьютексов20.04.2011, 17:44. Показов 6814. Ответов 20
Метки нет (Все метки)
мне нужно синхронизировать процессы с помощью мьютексов
насколько я понял в POSIX Threads таких глобальных мьютексов нет нашел про область видимости мьютекса, про pthread_mutexattr_setpshared(), вроде как межпроцесные мьютексы используются через разделяемую память но как это сделать не понял пример можно?
0
|
|
| 20.04.2011, 17:44 | |
|
Ответы с готовыми решениями:
20
Синхронизировать три нити трех процессов с помощью мьютекса
Синхронизировать три нити одного процесса с помощью оператор lock |
|
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
|
|
| 20.04.2011, 22:15 | |
|
Вы хотите именно pthread_mutex_t или пойдет и семафор (наверное наиболее близкий аналог вражеского named mutex) или что-то другое?
1
|
|
|
1 / 1 / 1
Регистрация: 28.11.2010
Сообщений: 37
|
|
| 20.04.2011, 22:29 [ТС] | |
|
семафоры не подойдут, нужны именно мьютексы
0
|
|
|
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
|
||||||
| 20.04.2011, 22:36 | ||||||
Сообщение было отмечено Памирыч как решение
Решение
Например так:
2
|
||||||
|
1 / 1 / 1
Регистрация: 28.11.2010
Сообщений: 37
|
|
| 20.04.2011, 22:40 [ТС] | |
|
спасибо, видимо это то, что нужно
0
|
|
|
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
|
|
| 20.04.2011, 22:42 | |
|
Вам видней, что именно нужно) я вот до сих пор 1й пост перечитываю и пытаюсь осознать)))
0
|
|
|
1 / 1 / 1
Регистрация: 28.11.2010
Сообщений: 37
|
||||||
| 21.04.2011, 23:33 [ТС] | ||||||
|
наверное чо то не так делаю
прописал в обоих программах
второй процесс так же затем пытается его захватить следовательно он должен приостановиться пока первый не оставит мьютекс(что мне и нужно) но второй процесс этого не делает и пашет дальше без остановки
0
|
||||||
|
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
|
|
| 22.04.2011, 10:26 | |
|
И действительно)
IPC_PRIVATE годиться для схемы которую я вам показал (родитель+ребенок), но не для отдельных процессов. используйте любой другой ключ.
2
|
|
|
|
|
| 22.04.2011, 16:12 | |
|
Вопрос немного в сторону: зачем нужен именно mutex? В юниксе mutex представляет собой объект (а точнее, кусок памяти) приложения, в отличие от винды, где mutex является объектом ОС. Поэтому их используют там, где имеется в наличии общая память (в потоках). Плодить кусок разделяемой памяти и родить в нём mutex - в чём прикол? Чем оно лучше семафора?
0
|
|
|
1 / 1 / 1
Регистрация: 28.11.2010
Сообщений: 37
|
|
| 22.04.2011, 23:00 [ТС] | |
|
у меня задание такое
Добавлено через 2 часа 44 минуты а если у меня несколько процессов? читал, но так и не понял, что нужно здесь поменять shared_mem_id = shmget(key, sizeof(pthread_mutex_t), 0660); shared_mem_ptr = (int *)shmat(shared_mem_id, (void *)0, 0); чтобы создать другой сегмент разделяемой памяти для другого процесса
0
|
|
|
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
|
|
| 22.04.2011, 23:48 | |
|
Вам не надо создавать сегмент для другого процесса, вам нужно получить доступ к уже существующему.
Т.е. вам надо реализовать такую схему: мастер: c помощью ftok() создаем ключ. делаем shmget(key, , 0666|IPC_CREAT|IPC_EXCL) делаем shmat() инициализируем атрибуты, сам мьютекс и опционально указатель на него слейв(ы): c помощью ftok() создаем ключ. (заметьте ключи у мастера и слейвов должны обязательно совпадать) делаем shmget(key, , 0666) - оно вернет ошибку если мастер не создал сегмент делаем shmat() и инициализируем указатель на мьютекс
2
|
|
|
1 / 1 / 1
Регистрация: 28.11.2010
Сообщений: 37
|
|
| 23.04.2011, 20:38 [ТС] | |
|
насколько я понял эта схема для случая когда несколько слейвов синхронизируются одним и тем же мьютексом
я так везде и делал а щас я имел ввиду про создание нового сегмента для другого мьютекса, чтобы разные процессы синхронизировались разными мьютексами но в общем то я и так понял, что нужны просто разные ключи, для каждой пары (мастер-слейв) свой
1
|
|
|
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
|
||
| 24.04.2011, 10:36 | ||
|
Я к тому, что в схеме мастерr<->слейвы мьютекс штука явно долго живущая и смысла просить отдельный кусок памяти под каждый мьютекс как бы и нет. Выделяйте сразу память под массив из мьютексов.
2
|
||
|
|
|
| 24.04.2011, 12:21 | |
|
кстати, если подходит использование boost, то в boost.interprocess есть именованные мьютексы.
использовал в нескольких проектах. очень доволен, как и всем в boost`е
0
|
|
|
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
|
|
| 24.04.2011, 12:26 | |
|
niXman, третьим будите кто пытается впарить ТС семафор) Но он доблестно отказывается)))
0
|
|
|
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
|
|
| 24.04.2011, 12:41 | |
|
Так по этому и не приемлемо. ТС раза 3 повторил, что с него в приказном порядке хотят pthread_mutex_t
0
|
|
|
|
|
| 24.04.2011, 12:45 | |
|
так пусть при помощи семафоров создает расшаренные именованные ресурсы в виде структур. тогда сможет получать их по имени. ну и применять к ним pthread`ные функции.
просто я не всю тему читал. может и это уже предлагали.
0
|
|
|
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
|
|
| 24.04.2011, 12:47 | |
|
а примерно так и сделали.
0
|
|
|
1 / 1 / 1
Регистрация: 28.11.2010
Сообщений: 37
|
|
| 25.04.2011, 16:48 [ТС] | |
|
тогда для второго мьютекса
shared_mem_id = shmget(key, sizeof(pthread_mutex_t)*2, 0660); shared_mem_ptr = (int *)shmat(shared_mem_id, (void *)0, 0); mptr2 = (pthread_mutex_t *)shared_mem_ptr+1; так?
0
|
|
| 25.04.2011, 16:48 | |
|
Помогаю со студенческими работами здесь
20
Синхронизировать три нити одного процесса с помощью глобальных переменных
Использование семафоров и мьютексов синхронизация процессов с использованием мьютексов Синхронизация процессов при помощи мьютексов Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога
Финальные проекты на Си и на C++:
finish-rectangles-sdl3-c. zip
finish-rectangles-sdl3-cpp. zip
|
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие.
Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
|
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ВВЕДЕНИЕ
Выполняя задание на управление насосной группой заполнения резервуара,. . .
|
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
|
|
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога
Финальные проекты на Си и на C++:
hello-sdl3-c. zip
hello-sdl3-cpp. zip
Результат:
|
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога
MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
|
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд.
Даже если у вас. . .
|
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает
монорепозиторий в котором находятся все исходники.
При создании нового решения, мы просто добавляем нужные проекты
и имеем. . .
|