Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2005.01.23;
Скачать: [xml.tar.bz2];

Вниз

Вопрос про 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 вся ветка

Форум: "WinAPI";
Текущий архив: 2005.01.23;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.45 MB
Время: 0.043 c
14-1105047776
Копир
2005-01-07 00:42
2005.01.23
Поздравляю всех ув. респондентов с праздником Светлого Христова Р


1-1105531581
TButton
2005-01-12 15:06
2005.01.23
RGB->HSB->RGB


1-1105137755
Oddin
2005-01-08 01:42
2005.01.23
TImage


14-1104959561
jack128
2005-01-06 00:12
2005.01.23
История про Мудрый Хост


1-1105134985
GEKSHI
2005-01-08 00:56
2005.01.23
DELPHI и HTML





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский