Форум: "Основная";
Текущий архив: 2004.03.28;
Скачать: [xml.tar.bz2];
ВнизПотоки и DLL Найти похожие ветки
← →
Andrew2 (2004-03-04 14:15) [0]Вопрос к тем, кто силен в теории.
В моем приложении - несколько потоков, которые должны обращаться к одной и той же DLL. DLL вызывается через LoadLibrary в каждом потоке. Верно ли:
- что при этом в памяти находится один и тот же экзкмпляр DLL
- что при одновременном доступе к метолам DLL из разных потоков данные перемешиваются
- что в DLL надо вводить средства синхронизации доступа (напр., Critical sections)
Спасибо,
Андрей
← →
Romkin © (2004-03-04 14:18) [1]Верно. Может еще понадобиться реакция на DLL_THREAD_ATTACH
← →
Digitman © (2004-03-04 14:48) [2]> Верно ли:
> - что при этом в памяти находится один и тот же экзкмпляр
1. Верно.
> - что при одновременном доступе к метолам DLL из разных
> потоков данные перемешиваются
2. Смотря что понимать под "данными" и под их "перемешиванием"
3. Необязательно. Смотря к каким данным и как происходит мультипоточное обращение
← →
Andrew2 (2004-03-04 16:27) [3]Метод из DLL, вызванный потоком, может быть достаточно длинным. Что лучше делать вместо блокировки работы других потоков с этим DLL-методом? Или единственное решение, позволяющее одновременную работу потоков - переносить функциональность из DLL в контекст поток?
← →
Digitman © (2004-03-04 16:38) [4]
> Метод из DLL, вызванный потоком, может быть достаточно длинным
ну и что ? ничто не мешает параллельному вызову одной и той же подпрограммы более чем одним потоком
другой вопрос, что в ходе работы вызываемой п/программы маш.код в ее теле обращается к некоему ресурсу, например, файлу
естественно, если допустить мультипоточное обращение к файлу без принятия спец.мер по сериализации этих обращений со стороны нескольких потоков одновременно. ситуация выходит из под контроля, вплоть до краха процесса ..
посему такая п/программа д.выглядеть. например. след.образом :
procedure WriteToFile;
begin
CritSect.Enter;
try
...обращение к ресурсу (например, файлу на диске)
finally
CritSect.Leave;
end;
end;
← →
Andrew2 (2004-03-04 16:53) [5]Да, с файлом понятно. А что будет с переменными, используемыми в методе DLL? Они ведь станут перезаписываться данными не-своих потоков? (Я имею ввиду глобальные переменные в DLL)
Если сделать:
в методе DLL создается экземпляр какого-либо класса, вызывается метод этого класса, класс что-то вычисляет/выполняет и результат возвращается в вызвавший поток. Правильно ли я понимаю, что в этом случае возможно корректное одновременное обращение к методу DLL из многих потоков без необходимости блокирования работы друг друга?
← →
Romkin © (2004-03-04 17:04) [6]Если создается - то это явно не глобальная переменная, а переменная потока. Другие потоки об этом объекте же ничего не знают? Они свои создают? ТАк и пересечения нет
← →
Digitman © (2004-03-04 17:11) [7]
> А что будет с переменными
та же самая ситуация
procedure WriteVariable(Value: SomeType);
begin
CritSect.Enter;
try
SomeVariable := value;
finally
CritSect.Leave;
end;
end;
> в методе DLL создается экземпляр какого-либо класса
не в методе, а в процедуре или ф-ции ... нет в эксп.вызовах DLL никаких "методов" ... терминологию подправь .. легче понимать тебя будет
а по сабжу - думаю, нет необходимости принимать меры к сериализации ... ибо при вызове п/программы (в некоем, неважно каком, потоке) создается ОТДЕЛЬНЫЙ объект со СВОИМИ полями, над этими НЕЗАВИСИМЫМИ полями (от почих полей прочих объектов того же класса) в конструкторе объекта производятся некие действия, и рез-т этих действий возвращается запрашивающему коду в запрашивающем потоке
но в этом случае при иниц-ции библ-ки оч важно установить
IsMultiThread := True
дабы менеджер памяти работал корректно в мультипоточной среде
← →
Andrew2 (2004-03-04 17:34) [8]>не в методе, а в процедуре или ф-ции ... нет в эксп.вызовах DLL >никаких "методов" ... терминологию подправь .. легче понимать >тебя будет
Виноват, это по-инерции. Мой основной язык - Java.
Спасибо большое за обсуждение и помощь в понимании :)
← →
Digitman © (2004-03-04 17:56) [9]
> Мой основной язык - Java
Java или не Java - не имеет никакого отношения к концепции и механизмам динамически компонуемых библиотек
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.03.28;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.034 c