Приветствую,
ОБЯЗАТЕЛЬНО нужно вызывать 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();
}
Помогите плз ! У рихтера как-то мутно по этому поводу написано... Не понятно можно делать как в первом варианте
или нет.... ?