Главная страница
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.027 c
3-1308557586
MacroDenS
2011-06-20 12:13
2017.01.15
ADO + Excel


15-1450042201
Юрий
2015-12-14 00:30
2017.01.15
С днем рождения ! 14 декабря 2015 понедельник


15-1452147343
pavelnk
2016-01-07 09:15
2017.01.15
Вирусная программа в браузере


15-1450878108
RWolf
2015-12-23 16:41
2017.01.15
ToolButton для выбора цвета шрифта


2-1424257125
SvetaZ
2015-02-18 13:58
2017.01.15
компонент TImage при больших размерах