#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?