Форум: "Базы";
Текущий архив: 2002.08.05;
Скачать: [xml.tar.bz2];
ВнизСкажите, специалисты по потокам, где эта структура незащищена? Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.004 c