Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.005 c
1-13689
Mis
2002-07-22 23:49
2002.08.05
Как в переменную типа Tbitmap загрузить Jpeg-картинку?


1-13600
OLEG.S
2002-07-24 14:58
2002.08.05
ПОМОГИТЕ ПОЖАЛУЙСТА, У МЕНЯ ЕСТЬ ЗАДАЧКА-НАДО СРОЧНО РЕШИТЬ


3-13568
aleksmax
2002-07-15 15:45
2002.08.05
Запрос на объединение значений полей


1-13590
Xper
2002-07-24 13:49
2002.08.05
Два тупых вопроса. Один из них по NMHTTP.


14-13821
Brand
2002-07-09 23:28
2002.08.05
Build with runtime packages (Размер *.exe и *.dll)





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский