Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > dll со статическими данными в нескольких потоках


Автор: borisbn 4.8.2010, 15:59
Имеется: dll-ка. НЕ МОЯ. Исправить её я не могу ( вариант с дизассемблированием, исправлением и компиляцией masm'ом не предлагать ). В этой dll-ке есть пара функций, которые я resolv'лю динамически. При вызове этих функций из одного потока всё работает как надо. Когда же я вызываю их из разных потоков, то результаты что в одном, что в другом потоке неправильные. Я предположил, что в этих dll-ках есть статические данные, в которых сохраняется состояние между вызовами. Решил проблему так: в каждом потоке переименовываю файл dll с другим именем ( например, адрес класса потока ), и загружаю полученную копию. Решение не идеальное, но работает.
Вопрос: как это сделать лучше/правильнее/красивее. Нужное подчеркнуть smile

Автор: HellStranger 4.8.2010, 16:18
Как мы разграничиваем доступ разных потоков к разделяемым данным?.. Правильно! Критические секции, мьютексы и семафоры. Джефри Рихтер ещё супер-пупер объект обтекс разработал в своей книге "Создание эффективных Win32-приложений с учётом специфики 64-разрядной версии Windows" на базе семафоров. Теперь полагаем, что разделяемые данные- это вызов функций из кривоватых DLL, и проблема решена. Ну а что из описанных средств и как применять- это уже вам виднее...

Добавлено через 50 секунд
Цитата(borisbn @  4.8.2010,  15:59 Найти цитируемый пост)
Женщины отличаются от программистов тем, что у них чары состоят из стрингов


Блин, жжжёшь собака...  smile 

Автор: Abyx 4.8.2010, 17:49
HellStranger, вы ничего не понимаете в программировании, перестаньте уже писать всякий бред.


borisbn написал что у него проблема в глобальном состоянии, а не в одновременном вызове функций из нескольких потоков.

Добавлено через 6 минут и 21 секунду
как _лучше_ решить эту проблему я уже писал.

Загружать по копии длл на поток - это не масштабируемое решение. 
Я не знаю размер вашей длл в памяти, но если это единицы мегабайт, то при большим числе потоков это существенный расход памяти, и возможная потеря производительности если физической памяти не хватит. 

Нужно либо реализовать механизм copy-on-write чтобы избежать лишних копирований,
либо минимизировать копирования использовав свой загрузчик длл, который будет выборочно копировать куски из длл,
либо написать свою длл с той же функциональностью

Автор: boostcoder 4.8.2010, 18:11
Цитата(Abyx @  4.8.2010,  17:49 Найти цитируемый пост)
HellStranger, вы ничего не понимаете в программировании, перестаньте уже писать всякий бред.

вряд ли он понимает это..
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
HellStrangerjonieMAKCim, вариант с локированием ничем ( практически ) не отличается от однопоточного приложения. Мне нужно распараллелить вычисления, которые должны проводиться над разными данными для разных потоков.

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 ничем не лучше, чем то что я сделал.
Честно говоря, мы уже закончили работу над этим проектом и сдали заказчику. Я просто хотел узнать на будущее, есть ли более простое и быстрое решение этой проблемы, чем это брутальное, но работающее smile

Автор: borisbn 7.8.2010, 19:58
Цитата(HellStranger @  4.8.2010,  16:18 Найти цитируемый пост)
Цитата(borisbn @  4.8.2010,  15:59 )Женщины отличаются от программистов тем, что у них чары состоят из стринговБлин, жжжёшь собака...   

мне у http://forum.vingrad.ru/users/W4FhLF даже больше нравится

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)