LINUX.ORG.RU

С++ подскажите удобные способы синхронизации процессов


0

1

Программа делает 4-8 раз fork(). Дети выполняют однотипные действия и в конце своем каждый потомок производит запись в базу данных. Так вот эта запись должна делаться последовательно, тоесть в начале первый запущеный поток, потом второй и так далее.

Какие методы синхронизации более удобны в данном случае.

Я привык пользоваться boost::mutex и нитями, но в данном случае нужен именно fork(). Спасибо.

Буду благодарен любом примеру.


Курите в сторону System V IPC, в частности, семафоров. Мы вашу задачку на первому курсе делали на парах по проганью=)

Divius ★★
()

>Я привык пользоваться boost::mutex и нитями, но в данном случае нужен именно fork(). Спасибо.
Что мешает пользоваться системным mutex/futex?

Booster ★★
()
Ответ на: комментарий от creepnee

Я просто реально не соображу, чем они в принципе отличаются. Гугл даёт что-то, что, вроде как, нам называли System V IPC=) Или я уже всё путаю?

Divius ★★
()

Если нужны мутексы, можно разместить их в разделяемой памяти. Но в данном случае достаточно по socketpair-у между детьми и write/read туда/оттуда одного байта для сигнализации.

Sorcerer ★★★★★
()

Читайте «Ульям Стивенс, UNIX взаимодействие процессов».

Eddy_Em ☆☆☆☆☆
()

вопрос ко всем советчикам: каким образом все ваши IPC помогут решить, как мне показалось, главную задачу - «Так вот эта запись должна делаться последовательно, тоесть в начале первый запущеный поток, потом второй и так далее.»?

мое предложение такое: делаешь еще один процесс, который работает с базой, все остальные посылают ему данные, и какой-то идентификатор, например порядковый номер самого себя, а этот процесс в свою очередь пишет данные в базу, определяя последовательность исходя из идентификаторов, пришедшие в неправильном порядке данные процесс будет кэшировать, и ожидать прихода нужных данных.

Cy6erBr4in ★★★
()

если в проекте уже есть буст то можно взять мьютексы и другую синхронизацию из boost::interprocess

sleepy
()
Ответ на: комментарий от Cy6erBr4in

> каким образом все ваши IPC помогут решить, как мне показалось, главную задачу

мое предложение такое: делаешь еще один процесс, который работает с базой

Может еще репликацию поднять, на всякий пожарный? :)

Sorcerer ★★★★★
()

но в данном случае нужен именно fork()

Интерестно узнать почему, если позволите?

vertexua ★★★★★
()
Ответ на: комментарий от vertexua

Не усложняйте задачу без необходимости. Синхронизировать процессы между собой в данном случае можно без доп.процесса.

Sorcerer ★★★★★
()
Ответ на: комментарий от Sorcerer

процессы вообще между собой не надо синхронизировать в данном случае, нужно работу с базой синхронизировать, и тут лучше всего делать это через отдельный процесс. Задача таким образом не усложняется, а упрощается.

Cy6erBr4in ★★★
()
Ответ на: комментарий от Cy6erBr4in

Работа с базой через отдельный процесс - это не самое лучшее решение во многих случаях. Например, в этом. Нет необходимости гонять данные между процессами и кэшировать их только для того, чтобы эти данные записались в нужном порядке. Процессы и сами могут записать свои данные. Как обеспечить требуемый порядок записи - об этом в постах выше Вашего первого.

Sorcerer ★★★★★
()
Ответ на: комментарий от Cy6erBr4in

Мой, например:

в данном случае достаточно по socketpair-у между детьми и write/read туда/оттуда одного байта для сигнализации.

Т.е. ребёнок делает работу, затем читает из предыдущего пайпа 1 байт, затем пишет в БД, потом пишет в следующий пайп 1 байт.

Sorcerer ★★★★★
()
Ответ на: комментарий от Sorcerer

а теперь посчитай количество связей между процессами, если их будет хотя бы пять? потом сравни с количеством связей между теми же пятью и еще одним... что, хочешь сказать это легче/правильнее/разумнее? сделайте меня развидеть это...

Cy6erBr4in ★★★
()
Ответ на: комментарий от Cy6erBr4in

Один рабочий процесс связан максимум с двумя - с предыдущим и следующим. socketpair-ов столько же, сколько и процессов. Фактически socketpair-ы тут исполняют функцию семафоров, что предлагалось и ранее.

Sorcerer ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.