URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 4209
[ Назад ]

Исходное сообщение
"Вопрос связанный с синхронизацией, и шаредной памятью"

Отправлено Man_With_No_Name_ , 24-Апр-05 03:06 
У меня есть две нити, которые должны использовать общую память.  
Принцип работы такой:
1)создаётся структура в шаредной памяти, есть её пид
2)fork()
3) у одного процесса shmat() - получаю указательна неё
4) у второго аналогично
5) у структуры есть поле - указатель на некую область памяти, я хочу, чтоб она была видна из обоих нитей. В одной нити я делаю shmget, и вот указатель в той структуре настраиваю через shmat на эту область памяти
6) в другой нити имея структуру, и то есть указатель хочу получить доступ к этой области памяти, которую только что выделил, но получаю Segmentation Fault.

Вопрос такой: как мне можно сделать такой доступ, какой я пытался сделать.


Содержание

Сообщения в этом обсуждении
"Вопрос связанный с синхронизацией, и шаредной памятью"
Отправлено DeadMustdie , 24-Апр-05 18:07 
>У меня есть две нити, которые должны использовать общую память.
>Принцип работы такой:
>1)создаётся структура в шаредной памяти, есть её пид

pid структуры в шаредной памяти ?????

>2)fork()
>3) у одного процесса shmat() - получаю указательна неё
>4) у второго аналогично

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

>5) у структуры есть поле - указатель на некую область памяти, я
>хочу, чтоб она была видна из обоих нитей. В одной нити
>я делаю shmget, и вот указатель в той структуре настраиваю через
>shmat на эту область памяти
>6) в другой нити имея структуру, и то есть указатель хочу получить
>доступ к этой области памяти, которую только что выделил, но получаю
>Segmentation Fault.

Чего и следовало ожидать. Указатель, действительный в адресном
пространстве одного процесса, недействителен в адресном пространстве
другого. Скажу больше: поскольку shmat() на вновь созданную структуру
выполнен только в одном из процессов, в другом возможности обратиться
к соответствующему блоку просто нет. Данный блок не спроецирован в
адресное пространство того процесса, в коем происходит обращение.

>
>Вопрос такой: как мне можно сделать такой доступ, какой я
>пытался сделать.
>

Честно: я не понял, в чём состояла цель столь странных манипуляций.
А потому внятно ответить на последний вопрос я не могу :)


"Вопрос связанный с синхронизацией, и шаредной памятью"
Отправлено MaximKuznetsov , 24-Апр-05 20:42 
>У меня есть две нити, которые должны использовать общую память.
если это действительно нити, то и создавайте их через pthread_create

>Принцип работы такой:
>1)создаётся структура в шаредной памяти, есть её пид
видемо имеется в виду ключ..
>2)fork()
>3) у одного процесса shmat() - получаю указательна неё
>4) у второго аналогично
>5) у структуры есть поле - указатель на некую область памяти, я
что за некая область памяти ? Если это поле упомянутой структуры,
то помещаете смещение поля, а не абсолютный адрес...если это еще одна shared mem., то укажите ее ключ..
>хочу, чтоб она была видна из обоих нитей. В одной нити
>я делаю shmget, и вот указатель в той структуре настраиваю через
>shmat на эту область памяти
>6) в другой нити имея структуру, и то есть указатель хочу получить
>доступ к этой области памяти, которую только что выделил, но получаю
>Segmentation Fault.
>
>Вопрос такой: как мне можно сделать такой доступ, какой я пытался сделать.
1) использовать нити (то есть одну большую память)и не заморачиваться с разделением памяти между задачами..
2) точнее формулировать вопросы