Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
3 / 3 / 0
Регистрация: 27.02.2014
Сообщений: 36
1

VC++ 6.0 dll c секцией разделяемой памяти

22.02.2018, 01:12. Показов 634. Ответов 0
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть библиотека (dll) с секцией разделяемой памяти
C++
1
2
3
4
5
6
#pragma data_seg(".snl")
_RING           Ring[RING_MAX]  = {0};
#pragma data_seg()                                                  
#pragma comment(linker,"/SECTION:.snl,RWS")
 
_RING Cell;
В разделяемой памяти находятся кольцевой буфер из структур такого вида:
C++
1
2
3
4
5
6
7
8
struct _RING
{
    bool            IsFreeToAction;
    unsigned char   TargetId;
    _PACK           Pack;
    _RING           *Next;
    _RING           *Prev;
};
Указатели *Next и *Prev закольцовывают буфер в двух направлениях

В той части dll, которая попадает в адресное пространство процесса, есть буфер (Cell) в котором производится сериализация-десериализация данных.

Что имеем:
Есть 2 приложения А и Б.
Оба приложения грузят одну и ту же dll по одинаковому пути.
Приложение А "собирает" данные в свой буфер (Сell).
Копирует содержимое буфера Cell в какой-либо элемент кольцевого буфера по средствам memcpy(&Ring[x],&Cell,sizeof(_RING)).
Второе приложение Б "узнает" индекс в кольце, пробует прочитать данные и получает access violation to read.

Более простой вариант, когда в распределенной памяти висит какой-нибудь int и приложение А его постоянно изменяет, а приложение Б его постоянно читает, прокатывает без проблем.

Подозреваю, что проблема как-то связана с memcpy(...) или с указателями *Next и *Prev

Добавлено через 5 часов 36 минут
В общем разобрался. Сама по себе разделяемая память не может одновременно использоваться двумя и более потоками/процессами. Пришлось прикручивать мьютекс.
С одной стороны всё классно - dll работает как часы и можно спокойно перебрасывать любые данные между процессами. С другой стороны, функция отправки пакета, функция проверки наличия пакетов и функция получения пакета стали блокируемыми. И время их блокировки возрастает по мере роста количества "подключенных" к dll процессов/потоков, не глядя на то, что они выполняются на одном дыхании.

Добавлено через 23 секунды
Тему можно закрыть
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.02.2018, 01:12
Ответы с готовыми решениями:

Аська на основе разделяемой памяти
Прогреры и хакеры и им подобные... обращаюсь с особой просьбой: есть мысли по поводу перессылки...

Хранение указателей в разделяемой памяти
Выручайте ребята. Задали лабораторную на взаимодействие процессов. Не могу справиться с...

Синхронизация доступа к разделяемой памяти
Когда потоки являются дочерними по отношению к процессу тут все просто - объект мьютекса находится...

Считать структуру из разделяемой памяти
Добрый день! Есть разделяемый файл. В приложении А в файл запихиваю структуру. В приложении Б...

0
22.02.2018, 01:12
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.02.2018, 01:12
Помогаю со студенческими работами здесь

Запись и считывание разделяемой памяти
Всем доброго времени суток. Столкнулся с одной проблемой. Есть две программы: 1 создаёт...

Прогон программ с использованием разделяемой памяти
/* Мы организуем разделяемую память для массива из трех целых чисел. Первый элемент массива...

Сделать массив из 10 int в разделяемой памяти
Хочу сделать массив из 10 int в разделяемой памяти. Доступ из разных процессов от fork(). Так...

В чем основное преимущество разделяемой памяти
Подскажите в чем основное преимуществоразделяемой памяти


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru