Главная страница
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.109 c
4-1072692276
Alexandr Tarasov
2003-12-29 13:04
2004.03.28
Блокирование файла в ОС Windows не используя полититку безопаснос


3-1077339999
Sirus
2004-02-21 08:06
2004.03.28
Можно ли выбрать в таблице записи у которых какое-либо поле NULL?


1-1078904652
Карелин Артем
2004-03-10 10:44
2004.03.28
Существует ли свойство у компонента?


1-1078512821
К.К.С.
2004-03-05 21:53
2004.03.28
MessageDLG


3-1077631653
Floppy
2004-02-24 17:07
2004.03.28
ADO - MSAccess. Не могу