Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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
2-1422510042
Смирнов А.И.
2015-01-29 08:40
2017.01.15
Копирование файла


15-1450856217
Dimka Maslov
2015-12-23 10:36
2017.01.15
Я ещё сплю?


2-1422590261
Drowsy
2015-01-30 06:57
2017.01.15
Message методы


2-1428788906
BBC
2015-04-12 00:48
2017.01.15
Фокусировка PaintBox


15-1455399002
Юрий
2016-02-14 00:30
2017.01.15
С днем рождения ! 14 февраля 2016 воскресенье





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский