Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.03.28;
Скачать: CL | DM;

Вниз

Потоки и 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.022 c
1-1077871975
Гарик
2004-02-27 11:52
2004.03.28
Как програмно из Delphi 7 изменить свойство компонента в Rave R.


14-1078394343
able
2004-03-04 12:59
2004.03.28
RTFTOHTML


1-1078422320
white
2004-03-04 20:45
2004.03.28
Форма


14-1077789105
_none_
2004-02-26 12:51
2004.03.28
метрополитен. правила.


8-1067867901
MAXHO
2003-11-03 16:58
2004.03.28
Звук, Звук и ещё раз звук......