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

Вниз

Скажите, специалисты по потокам, где эта структура незащищена?   Найти похожие ветки 

 
Aleksandr ©   (2002-07-15 12:28) [0]

Описание:
Поток0 - ищет файлы
Поток1 - поднимает указанные файлы, перерабатывает их в коллекции
Объект1 - объект, содержащий неизменяемую коллекцию потоков, выпоняющих изменения в таблицах SQL
Объект2 - потомок TList, содержащий справочную информацию.

Схема:
Поток0 создает список найденных файлов и для каждого создает экземпляр Потока1, передавая ему файл.
Поток1, обрабатывая файл, превращает его в коллекцию и вызывает метод Объекта1, передавая в качестве параметра коллекцию данных из файла.
В этом методе Объекта1 он передает своим Итемам в зависимости от номера кусок из полученной коллекции данных. Последние уже выполняют запросы.
Все указанные объекты и потоки берут служебную информацию из Объекта2.

Вопрос: что в этой схеме должно быть защищено критическими секциями?


 
Digitman ©   (2002-07-15 13:47) [1]

Как минимум - обращение к Object2 из тела нескольких потоков одновременно. Это в предположении, что TList может менять в произв.момент времени свое содержимое, например, при добавлении/удалении/модификации его элементов главным потоком


 
Aleksandr ©   (2002-07-15 13:58) [2]

Нет, и Объект2 и Объект1 имеют списки, заданные лишь однажды - при запуске.


 
Digitman ©   (2002-07-15 14:38) [3]

Ок.
Поясни тогда, что означает фраза
"Объект1 - объект, содержащий неизменяемую коллекцию потоков..."

Лучше - фрагментом кода декларации...



 
Aleksandr ©   (2002-07-15 15:53) [4]


TRITableItem = class;

TDataBaseManager = class
private
FTables : TCollectionList;
function GetTableItem( Idt : integer) : TRITableItem;
public
constructor Create; //в нем заполняется FTables
destructor Destroy; override;
procedure ProcessDBUpdate(IDT : word; EvList : TCollectionList);
//в ней передается список данных
property TableItem[ IDT : integer] : TRITableItem read GetTableItem;
end;

TRITableItem = class( TThread)
private
FDBUpdator : TDBUpdator;
FSQLUpdator : TSQLUpdator;
public
constructor Create(AUpdateState : TUpdateState;aIDT : word);
destructor Destroy; override;
procedure Execute; override;
procedure AddPutData( EvList : TCollectionList);
//в ней передаются данные и вызывается resume
property IDT : word read GetIDT;
end;


 
Digitman ©   (2002-07-15 16:54) [5]

Вот это
procedure AddPutData( EvList : TCollectionList);
поподробней ...


 
Aleksandr ©   (2002-07-15 18:46) [6]

procedure TRITableItem.AddPutData( EvList : TCollectionList);
begin
if not Assigned( EvList) then
Exit;
EnterCriticalSection( FPutCS);
while EvList.Count <> 0 do begin
FPutQueue.Add( EvList.Items[0]);
EvList.Delete(0)
end;
LeaveCriticalSection( FPutCS)
end;

FPutCS - приватное поле TRITblItem (я его в перечислениях убрал вместе с рядом другим приватов, которые никому снаружи доступны не могут быть)


 
Digitman ©   (2002-07-16 08:13) [7]

Я бы сделал так (и в данном и в общем случаях) :

procedure TRITableItem.AddPutData( EvList : TCollectionList);
begin
EnterCriticalSection( FPutCS);
try
...... код, потенциально опасный с т.з. возможности исключений
finally
// выход из крит.секции всегда должен быть выполнен, причем - безусловно
LeaveCriticalSection( FPutCS);
end;
end;

Ну, вроде бы все в порядке. Защити аналогичным или сходным образом все подобные по логике критические точки алгоритма.

А в чем проблема ? Где-то в коде коллизии происходят, по твоему мнению ? Именно - из-за отсутствия синхронизации ?



Страницы: 1 вся ветка

Текущий архив: 2002.08.05;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.009 c
14-13799
Format
2002-07-08 19:53
2002.08.05
RAR


1-13625
Spooky
2002-07-25 10:25
2002.08.05
Изменить масштаб TBitmap


1-13662
id_privin
2002-07-23 14:29
2002.08.05
Static variables


6-13743
chernoruk
2002-05-22 08:35
2002.08.05
Почему нет ошибки GetHostByName в OffLine?


3-13540
Andrey_
2002-07-15 12:17
2002.08.05
Проблемы с LookUp-полем в компонентах ODAC