![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
Имеется: dll-ка. НЕ МОЯ. Исправить её я не могу ( вариант с дизассемблированием, исправлением и компиляцией masm'ом не предлагать ). В этой dll-ке есть пара функций, которые я resolv'лю динамически. При вызове этих функций из одного потока всё работает как надо. Когда же я вызываю их из разных потоков, то результаты что в одном, что в другом потоке неправильные. Я предположил, что в этих dll-ках есть статические данные, в которых сохраняется состояние между вызовами. Решил проблему так: в каждом потоке переименовываю файл dll с другим именем ( например, адрес класса потока ), и загружаю полученную копию. Решение не идеальное, но работает.
Вопрос: как это сделать лучше/правильнее/красивее. Нужное подчеркнуть ![]() -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
HellStranger |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 107 Регистрация: 1.9.2009 Репутация: -2 Всего: -1 |
Как мы разграничиваем доступ разных потоков к разделяемым данным?.. Правильно! Критические секции, мьютексы и семафоры. Джефри Рихтер ещё супер-пупер объект обтекс разработал в своей книге "Создание эффективных Win32-приложений с учётом специфики 64-разрядной версии Windows" на базе семафоров. Теперь полагаем, что разделяемые данные- это вызов функций из кривоватых DLL, и проблема решена. Ну а что из описанных средств и как применять- это уже вам виднее...
Добавлено через 50 секунд
Блин, жжжёшь собака... ![]() |
|||
|
||||
Abyx |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 601 Регистрация: 3.11.2009 Репутация: 1 Всего: 10 |
HellStranger, вы ничего не понимаете в программировании, перестаньте уже писать всякий бред.
borisbn написал что у него проблема в глобальном состоянии, а не в одновременном вызове функций из нескольких потоков. Добавлено через 6 минут и 21 секунду как _лучше_ решить эту проблему я уже писал. Загружать по копии длл на поток - это не масштабируемое решение. Я не знаю размер вашей длл в памяти, но если это единицы мегабайт, то при большим числе потоков это существенный расход памяти, и возможная потеря производительности если физической памяти не хватит. Нужно либо реализовать механизм copy-on-write чтобы избежать лишних копирований, либо минимизировать копирования использовав свой загрузчик длл, который будет выборочно копировать куски из длл, либо написать свою длл с той же функциональностью |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
вряд ли он понимает это.. borisbn, что выполняет длл-ка? что из нее "торчит"? возможно получится использовать "хуки", или перехватить "торчащие" из не функции/методы.. Добавлено через 24 секунды и где вы эту длл-ку взяли? |
|||
|
||||
jonie |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 15 Всего: 118 |
ну как вариант сделать маршалинг в один поток входящих потоков. Т.е. делаем один поток, который работает с ДЛЛ, вида while(true){ стоим на семафоре; смотрим очередь "что делать"; делаем; отдаем результат; бросаем семафор.}
Можно маршалить как делает COM - через оконную очередь сообщений.... - кстати можно обернуть всю работу в COM классе, сделав его в модели STA и вообще забить - пусть сам COM разруливает маршалинг Это сообщение отредактировал(а) jonie - 4.8.2010, 21:33 -------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
HellStranger,
все правильно написал если два раза вызываем функу в однопоточном приложении, все же нормально, правильно...отсюда делаем вывод -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
HellStranger, jonie, MAKCim, вариант с локированием ничем ( практически ) не отличается от однопоточного приложения. Мне нужно распараллелить вычисления, которые должны проводиться над разными данными для разных потоков.
Abyx, в моей задаче количество запускаемых потоков равно количеству ядер процессора, размер одной dll-ки 200 КБ ( на диске, в памяти - не знаю ), поэтому не вижу смысла делать свой загрузчик для экономии 0,5 ... 1 МБ памяти на сервере, на котором стоит 4 ГБ. boostcoder, dll-ка выполняет фильтрацию сигнала каким-то хитрым БИХ-фильтром с неизвестной мне ИХ. dll-ка наша, но такой давности, что, к сожалению, исходников нийти не удалось. А писал её не программист, а математик, отсюда и проблема. А "торчат" из неё две функции init и filter. P.S. Дело в том, что на данный момент меня всё устраивает. Я не могу понять, почему все участники считают, что это самое кривое решение из всех возможных ? Это сообщение отредактировал(а) borisbn - 5.8.2010, 08:29 -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
Abyx |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 601 Регистрация: 3.11.2009 Репутация: 1 Всего: 10 |
borisbn, так сразу и сказали бы, что там 2-4 копии
|
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
Abyx, пардон, что не сказал. А копий - 8.
-------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
Dem_max |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 4 Всего: 39 |
А как часто вызывается функция filter ? и какое время она работает ?
Может все таки стоит узнать что за фильтр такой и заного написать его. -------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
Dem_max, фильтр удаления низкочастотных шумов из записей. Понимаешь, эта функция ( вернее эта dll-ка ) меня полностью устраивает, и решение переписать или найти подобное и исправить под свои нужды IMHO ничем не лучше, чем то что я сделал.
Честно говоря, мы уже закончили работу над этим проектом и сдали заказчику. Я просто хотел узнать на будущее, есть ли более простое и быстрое решение этой проблемы, чем это брутальное, но работающее ![]() -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
мне у [B]W4FhLF[/B] даже больше нравится -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |