Форум: "Прочее";
Текущий архив: 2017.01.15;
Скачать: [xml.tar.bz2];
ВнизТормоза с EnterCriticalSection в 32-х битном приложении на x64 ОС Найти похожие ветки
← →
KSergey © (2016-01-29 10:11) [0]Есть 32-х битное приложение.
Перенести его на WIndows 2012 x64 - и вдруг столкнулись с проблемой, что тормозит вызов EnterCriticalSection (в приложении несколько потоков).
При этом точно известно, что секция никем не занята.
Гугль ничего путнего не подсказывает, или не могу подобрать верные слова.
Может кто-то сталкивался или что-то попадалось на эту тему?
← →
DVM © (2016-01-29 10:26) [1]Что значит тормозит? В числах это как то можно охарактеризовать.
Сколько потоков? Как часто они входят в критическую секцию?
Может тормозит не сам вход в критическую секцию, а долго выполняется код внутри нее?
← →
Eraser © (2016-01-29 10:54) [2]
> KSergey © (29.01.16 10:11)
телепатирую: Sleep(0) внутри потоков, вне крит. секции нужно добавить.
← →
KSergey © (2016-01-29 12:20) [3]> Sleep(0) внутри потоков, вне крит. секции нужно добавить.
Перед EnterCriticalSection()??
← →
Palladin © (2016-01-29 13:28) [4]в цикле ожидания, перед проверкой на terminated
← →
KSergey © (2016-01-29 14:50) [5]Какого ожидания??!!
Есть длинный код, пусть например никакой проверки на terminated в нём нет. Ну вот такой вот длинный расчётный код. Временами он обращается к общим данным с другими аналогичными по структуре потоками. Т.к. общие данные модифицируются - есть EnterCriticalSection().
И вот вдруг оказалось, что именно EnterCriticalSection() стала вносить заметные тормоза в данном коде на x64 платформе (код, напомню, 32-бинтый).
На x86 платформе претензий к ней не было и нет.
Куда в данном случае приткнуть Sleep() - мне и не понятно.
← →
Palladin © (2016-01-29 16:05) [6]длинный код на тыщи миллионов строк? без циклов?
← →
Pavia © (2016-01-29 22:01) [7]
> Может кто-то сталкивался или что-то попадалось на эту тему?
Основных две причины:
- код EnterCriticalSection отличается.
Но насколько это не ваш случай. Вы сменили ОС, а не выходную платформу компилятора.
- Ошибка в коде. Ранее вы её не замечали так как смена потоков не попадали на критическую секцию, а потом стали.
Sleep() - это костыль, но порой помогает.
А вообще правильно вызывать ThreadSwitch() вместо Sleep().
Что-бы выявить проблему надо узнать как часто потоки входят в критическую секцию. Сколько в них проводят. А также сколько тратиться время на вход.
← →
NoUser © (2016-01-29 22:11) [8]>[0] При этом точно известно, что секция никем не занята.
Это как?
> Eraser © (29.01.16 10:54) [2]Sleep(1)
KSergey © (29.01.16 12:20) [3],[5]TryEnterCriticalSection
Ну, и есть такой костыль:TSimpleLock = record
fLock : Integer;
fThCn : Integer;
fThId : Cardinal;
procedure Init;
procedure Enter;
procedure Leave;
end;
{ TSimpleLock }
procedure TSimpleLock.Enter;
begin
if ( AtomicExchange(fLock, 1) = 1 ) then
if ( GetCurrentThreadId() <> fThId )
then while ( AtomicExchange(fLock, 1) = 1 ) do Sleep(1)
else
begin
Inc(fThCn);
Exit;
end;
fThId := GetCurrentThreadId();
end;
procedure TSimpleLock.Init;
begin
ZeroMemory(@Self, SizeOf(Self));
end;
procedure TSimpleLock.Leave;
begin
if (fThCn > 0) then Dec(fThCn)
else
begin
fThId := 0;
AtomicExchange(fLock, 0);
end;
end;
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2017.01.15;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.056 c