Поместить три отдельных массива в общую память

#c #parallel-processing #multiprocessing #shared-memory

#c #параллельная обработка #многопроцессорная обработка #разделяемая память

Вопрос:

У меня есть задание параллельного программирования с использованием многопроцессорной обработки и многопоточности (реализация параллельного решения для нахождения LCS двух строк путем распространения антидиагональной волны). У меня есть три отдельных массива (фактически int* ов), представляющих первый, средний и последний антидиагональный «волны», все они хранятся в структуре, подобной такой:

 typedef struct shared_buffer
{
    int *back;
    int *middle;
    int *front;
} shared_buff;
  

В main() у меня есть следующие объявления:

 // MAX_ANTIDIAG_LENGTH is a macro, defined as the *minimum* of the lengths of the two input strings

int id = shmget(ftok("/dev/null", 5), MAX_ANTIDIAG_LENGTH * 3, 0644 | IPC_CREAT);
shared_buff* shared_mem = (shared_buff *) shmat(id, nullptr, 0);

shared_mem->back   = std::memcpy((int*)calloc(MAX_ANTIDIAG_LENGTH, sizeof(int)));
shared_mem->middle = std::memcpy((int*)calloc(MAX_ANTIDIAG_LENGTH, sizeof(int)));
shared_mem->front  = std::memcpy((int*)calloc(MAX_ANTIDIAG_LENGTH, sizeof(int)));
  

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

Следовательно, мой вопрос: как я могу сохранить эти три массива в общей памяти, чтобы все семейство процессов могло легко получить доступ к указанным массивам в квадратных скобках [] ?

Комментарии:

1. Почему typedef ?

2. Никакой реальной причины, просто для удобства.

3. Какое удобство ? Это не C. Вы можете просто сделать struct name и ссылаться на это с помощью name . Нет необходимости в typedef . Я предлагаю отказаться от любого источника C , который ввел для вас такую практику.

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

Ответ №1:

Вы разделяете int s, а не int * s. Каждому процессу нужен свой собственный shared_buff .

 int id = shmget(ftok("/dev/null", 5), MAX_ANTIDIAG_LENGTH * 3, 0644 | IPC_CREAT);
int* shared = reinterpret_cast<int *>(shmat(id, nullptr, 0));

shared_buff shared_mem;
shared_mem.back = shared;
shared_mem.middle = shared   MAX_ANTIDIAG_LENGTH;
shared_mem.front = shared   (2 * MAX_ANTIDIAG_LENGTH);
  

Комментарии:

1. Спасибо. Предположим, я хотел бы поменять местами массивы, будет ли это работать с ускорением std::swap ?

2. @SRSR333 что вы имеете в виду под «поменять местами массивы»? int s или int * s?