Сегв общей памяти - PullRequest
       20

Сегв общей памяти

1 голос
/ 22 февраля 2012

Я пытался использовать Boost и имел segv после 3000 размещений объектов размером 24, теперь я начал использовать sys / ipc.h и sys / shm.h, я выделяю 25 миллионов байтов (если я правильно понимаю)

, похоже, также работает правильно на моей Linux-коробке. Ipcs -m покажет выделенный сегмент

0x000081bc 917516     testUser 644        25000000   0

sysctl -p выведет

kernel.shmmax = 25500000

Для некоторыхПричина, по которой это работает, пока программа не достигнет "43406 x 24 байта", это место, где она будет сегментирована.Я был бы рад получить некоторые подсказки, где моя проблема лежит.Также обратите внимание, если это неправильный способ выделения и использования общей памяти с объектами.

#define MAXMYMEM 25000000
int sharedMemId;
x *p_sharedMemory;
x *p_other;
sharedMemId = shmget(2232, MAXMYMEM, IPC_CREAT | 0644);

if(sharedMemId >= 0){

    p_sharedMemory = (x*) shmat( sharedMemId, 0 , 0);

    if(p_sharedMemory != ( x *)-1) {

        cout << sizeof(x) << endl;

        for(unsigned int i = 0 ; i < 1000000;i++ ){



            (p_sharedMemory + (sizeof(x) * i))->setTest(i);

        }

1 Ответ

2 голосов
/ 22 февраля 2012

(p_sharedMemory + (sizeof(x) * i))->setTest(i);

Почему вы используете sizeof(x) здесь?Добавление одного к указателю, который указывает на x, будет указывать на следующий x, а не на следующий байт.Я подозреваю, что это ваша проблема.

изменить (p_sharedMemory + (sizeof(x) * i))->setTest(i); на

++p_sharedMemory;
p_sharedMemory->setTest(i);
...