Вопрос про 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();
}



Помогите плз ! У рихтера как-то мутно по этому поводу написано... Не понятно можно делать как в первом варианте
или нет.... ?
Re: Вопрос про TCriticalSection->Enter()
От: Softwarer http://softwarer.ru
Дата: 03.12.04 15:56
Оценка:
Здравствуйте, Аноним, Вы писали:

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

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

Не вижу разницы между этими вариантами.

Критическую секцию нужно вызвать (захватить, войти) перед непосредственным доступом к защищаемому ресурсу — "перед" в смысле порядка выполнения команд в программе.
Re[2]: Вопрос про TCriticalSection->Enter()
От: akasoft Россия  
Дата: 03.12.04 17:29
Оценка: 6 (1)
Здравствуйте, Softwarer, Вы писали:

S>Не вижу разницы между этими вариантами.


Ну, есть разница. Экономим стек и пару инструкций входа-выхода.

Теоретически и практически тело, обрамлённое в критическую секцию должно быть как можно более кратким, но не в ущерб функциональности.
... << RSDN@Home 1.1.4 beta 3 rev. 240 silent >>
Re[3]: Вопрос про TCriticalSection->Enter()
От: Softwarer http://softwarer.ru
Дата: 06.12.04 10:41
Оценка:
Здравствуйте, akasoft, Вы писали:

S>>Не вижу разницы между этими вариантами.

A>Ну, есть разница. Экономим стек и пару инструкций входа-выхода.

Согласен, лучше было бы сказать "не вижу принципиальной разницы"
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.