Главная страница
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.139 c
4-1102371235
Костинг Хостинг
2004-12-07 01:13
2005.01.23
Поле Description в сервисе как его заполнить при регистрации


4-1098777176
Sirus
2004-10-26 11:52
2005.01.23
Как отловить запсук процессов под Win9x/NT/2000/XP


1-1105562080
chir
2005-01-12 23:34
2005.01.23
ToolButton6.DropdownMenu.Popup(0,0); - как получить координаты?


1-1104916394
Bobby Digital
2005-01-05 12:13
2005.01.23
по центру


1-1105263770
Андрей М.
2005-01-09 12:42
2005.01.23
SelectDirectory с возможностью создать папку