Главная страница
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.024 c
14-1077984008
Dimaz-z
2004-02-28 19:00
2004.03.28
Проблемка. Linux.


11-1057351721
SKI
2003-07-05 00:48
2004.03.28
Работа с несколькими формами


1-1078584058
Happy SouL
2004-03-06 17:40
2004.03.28
как создать полупрозрачную форму но чо бы компоненты на ней были


4-1073984052
Pavel_P
2004-01-13 11:54
2004.03.28
Регионы (HGRN)


11-1056811361
mike.dld
2003-06-28 18:42
2004.03.28
Streams