Форум: "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.051 c