Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.032 c
1-1079003717
3asys
2004-03-11 14:15
2004.03.28
Определение компонента, над которым находится курсор мыши.


14-1077969040
Типа... Ламер и всё такое..
2004-02-28 14:50
2004.03.28
WinXP


7-1072264252
nester
2003-12-24 14:10
2004.03.28
Как внедрить свой тулбар в оутлук?


14-1078001008
VID
2004-02-28 23:43
2004.03.28
Мне нужен ваш совет


1-1078484177
PiratA
2004-03-05 13:56
2004.03.28
Динамическое создание компонент...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский