Вопрос про TCriticalSection->Enter()
От: Аноним  
Дата: 03.12.04 15:44
Оценка:
Приветствую,

ОБЯЗАТЕЛЬНО нужно вызывать TCriticalSection->Enter() именно ВНУТРИ потока ПЕРЕД вызовом функции, для которой и нужна критическая секция ?

Или TCriticalSection->Enter() можно вставить в начало вызываемой функции ?

У меня такая ситуация: есть много потоков, всем им передается указатель на класс TDNSCache, функции которого нужно вызывать через критические секции. Класс TDNSCache в качестве члена содержит TCriticalSection, которая создается в конструкторе, и далее используется при вызове всех функций TDNSCache.

Могу я написать так:


//------------------------
class TDNSCache {

public :

       GetCachedRecord(AnsiString Domain,TStringList *Resluts);

private:

       TCriticalSection *DNSCacheCritical;
};  
//------------------------

void __fastcall TDNSCache::GetCachedRecord(AnsiString Domain,TStringList *Resluts)
{
DNSCacheCritical->Enter();
bla bla bla
DNSCacheCritical->Leave();
}
//-------------------------

void __fastcall TMyTThreadDescedant::Execute()
{
TStringList *QueryResult=new TStringList;
DNSCache->GetCachedRecord(Domain,QueryResult); // указатель на TDNSCache передается в конструкторе потока.
}


или нужно убрать TCriticalSection из класса TDNSCache, объявить ее как глобальную переменную и делать так:


void __fastcall TMyTThreadDescedant::Execute()
{
TStringList *QueryResult=new TStringList;
DNSCacheCritical->Enter();
DNSCache->GetCachedRecord(Domain,QueryResult); 
DNSCacheCritical->Leave();
}



Помогите плз ! У рихтера как-то мутно по этому поводу написано... Не понятно можно делать как в первом варианте
или нет.... ?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.