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

Вниз

Тормоза с 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.026 c
4-1278387805
Rassamaha78
2010-07-06 07:43
2017.01.15
Запрет закрытия чужого приложения через WinAPI


15-1451560078
Kerk
2015-12-31 14:07
2017.01.15
С новым годом!


4-1281052143
korbin dalas
2010-08-06 03:49
2017.01.15
Как прочитать содержимое HDD без использования файлов?


15-1450560602
Юрий
2015-12-20 00:30
2017.01.15
С днем рождения ! 20 декабря 2015 воскресенье


15-1456097809
Kerk
2016-02-22 02:36
2017.01.15
Работа стоя