Главная страница
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.015 c
15-1447436787
data
2015-11-13 20:46
2017.01.15
подскажите по my sql


2-1423778824
Aleks
2015-02-13 01:07
2017.01.15
получить список объектов в чужом окне


15-1457040604
Юрий
2016-03-04 00:30
2017.01.15
С днем рождения ! 4 марта 2016 пятница


2-1419657072
SKIPtr
2014-12-27 08:11
2017.01.15
получение времени из DateTimePicker


2-1421889993
duponamk
2015-01-22 04:26
2017.01.15
Сортировка данных по нажатию на заголовок DBGrid