Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.01.23;
Скачать: CL | DM;

Вниз

Вопрос про CriticalSection   Найти похожие ветки 

 
amsdev   (2004-12-03 18:49) [0]

Приветствую,

ОБЯЗАТЕЛЬНО нужно вызывать 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);
}

-----------------------------

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

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

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


 
Alexander Panov ©   (2004-12-03 19:47) [1]

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

например:

Функция для чтения значений:

function GetValues: TMyType;
begin
 EnterCriticalSection(OneCS);
 try
   Result := MyGlobalVar;
 finally
   LeaveCriticalSection(OneCS);
 end;
end;


Процедура для записи значений:

procedure SetValues(Value: TMyType);
begin
 EnterCriticalSection(OneCS);
 try
   MyGlobalVar := Balue;
 finally
   LeaveCriticalSection(OneCS);
 end;
end;


 
Sumor   (2004-12-06 21:34) [2]

Критические секции, равно как и другие Windows средства для монополизации доступа (мьютексы например) работают только в РАЗНЫХ потоках. Если вы в главном потоке, допустим, по кнопке входите в критическую секцию, а только потом создаёте поток, то система сможет повторно войти в критическую секцию при повторном нажатии кнопки - так как это происходит в одном потоке. Для того, чтобы всё было нормально необходимо передавать указатель на критическую секцию в поток и входить в неё там.


 
Alexander Panov ©   (2004-12-06 22:26) [3]

Sumor   (06.12.04 21:34) [2]

Странно было бы использовать критические секции для синхронизации доступа в одном потоке.



Страницы: 1 вся ветка

Текущий архив: 2005.01.23;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.025 c
1-1104938889
X-Disa
2005-01-05 18:28
2005.01.23
Удаление ветки реестра


1-1105521279
Sndr
2005-01-12 12:14
2005.01.23
Наследование от TForm


14-1104968574
InTr
2005-01-06 02:42
2005.01.23
Внедрение своего кода в другой бинарник


1-1105038443
WHouse
2005-01-06 22:07
2005.01.23
Как добавить свой пункт в меню IE?


3-1103659183
Igor_P
2004-12-21 22:59
2005.01.23
SQL-запрос к таблице