Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Общие вопросы > dll со статическими данными в нескольких потоках |
Автор: borisbn 4.8.2010, 15:59 |
Имеется: dll-ка. НЕ МОЯ. Исправить её я не могу ( вариант с дизассемблированием, исправлением и компиляцией masm'ом не предлагать ). В этой dll-ке есть пара функций, которые я resolv'лю динамически. При вызове этих функций из одного потока всё работает как надо. Когда же я вызываю их из разных потоков, то результаты что в одном, что в другом потоке неправильные. Я предположил, что в этих dll-ках есть статические данные, в которых сохраняется состояние между вызовами. Решил проблему так: в каждом потоке переименовываю файл dll с другим именем ( например, адрес класса потока ), и загружаю полученную копию. Решение не идеальное, но работает. Вопрос: как это сделать лучше/правильнее/красивее. Нужное подчеркнуть ![]() |
Автор: Abyx 4.8.2010, 17:49 |
HellStranger, вы ничего не понимаете в программировании, перестаньте уже писать всякий бред. borisbn написал что у него проблема в глобальном состоянии, а не в одновременном вызове функций из нескольких потоков. Добавлено через 6 минут и 21 секунду как _лучше_ решить эту проблему я уже писал. Загружать по копии длл на поток - это не масштабируемое решение. Я не знаю размер вашей длл в памяти, но если это единицы мегабайт, то при большим числе потоков это существенный расход памяти, и возможная потеря производительности если физической памяти не хватит. Нужно либо реализовать механизм copy-on-write чтобы избежать лишних копирований, либо минимизировать копирования использовав свой загрузчик длл, который будет выборочно копировать куски из длл, либо написать свою длл с той же функциональностью |
Автор: boostcoder 4.8.2010, 18:11 | ||
вряд ли он понимает это.. borisbn, что выполняет длл-ка? что из нее "торчит"? возможно получится использовать "хуки", или перехватить "торчащие" из не функции/методы.. Добавлено через 24 секунды и где вы эту длл-ку взяли? |
Автор: jonie 4.8.2010, 21:32 |
ну как вариант сделать маршалинг в один поток входящих потоков. Т.е. делаем один поток, который работает с ДЛЛ, вида while(true){ стоим на семафоре; смотрим очередь "что делать"; делаем; отдаем результат; бросаем семафор.} Можно маршалить как делает COM - через оконную очередь сообщений.... - кстати можно обернуть всю работу в COM классе, сделав его в модели STA и вообще забить - пусть сам COM разруливает маршалинг |
Автор: MAKCim 4.8.2010, 21:33 |
HellStranger, все правильно написал если два раза вызываем функу в однопоточном приложении, все же нормально, правильно...отсюда делаем вывод |
Автор: borisbn 5.8.2010, 08:26 |
HellStranger, jonie, MAKCim, вариант с локированием ничем ( практически ) не отличается от однопоточного приложения. Мне нужно распараллелить вычисления, которые должны проводиться над разными данными для разных потоков. Abyx, в моей задаче количество запускаемых потоков равно количеству ядер процессора, размер одной dll-ки 200 КБ ( на диске, в памяти - не знаю ), поэтому не вижу смысла делать свой загрузчик для экономии 0,5 ... 1 МБ памяти на сервере, на котором стоит 4 ГБ. boostcoder, dll-ка выполняет фильтрацию сигнала каким-то хитрым БИХ-фильтром с неизвестной мне ИХ. dll-ка наша, но такой давности, что, к сожалению, исходников нийти не удалось. А писал её не программист, а математик, отсюда и проблема. А "торчат" из неё две функции init и filter. P.S. Дело в том, что на данный момент меня всё устраивает. Я не могу понять, почему все участники считают, что это самое кривое решение из всех возможных ? |
Автор: Abyx 5.8.2010, 08:51 |
borisbn, так сразу и сказали бы, что там 2-4 копии |
Автор: borisbn 5.8.2010, 08:54 |
Abyx, пардон, что не сказал. А копий - 8. |
Автор: Dem_max 5.8.2010, 16:29 |
А как часто вызывается функция filter ? и какое время она работает ? Может все таки стоит узнать что за фильтр такой и заного написать его. |
Автор: borisbn 5.8.2010, 16:38 |
Dem_max, фильтр удаления низкочастотных шумов из записей. Понимаешь, эта функция ( вернее эта dll-ка ) меня полностью устраивает, и решение переписать или найти подобное и исправить под свои нужды IMHO ничем не лучше, чем то что я сделал. Честно говоря, мы уже закончили работу над этим проектом и сдали заказчику. Я просто хотел узнать на будущее, есть ли более простое и быстрое решение этой проблемы, чем это брутальное, но работающее ![]() |
Автор: borisbn 7.8.2010, 19:58 | ||
мне у http://forum.vingrad.ru/users/W4FhLF даже больше нравится |