Russian Qt Forum
Ноябрь 22, 2024, 20:00 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Штатная ф-ция Spin Lock (Windows) ?  (Прочитано 5465 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Июль 05, 2010, 11:01 »

Добрый день

Переношу параллельные вычисления с OSX на Вындоуз. Нужна ф-ция "спиннера" (прокрутки). Я сделал так

Код:
void LockSpin( volatile int * theSpin ) 
{
int spinCount = 0;
while (InterlockedExchange(theSpin, 1) != 0)
spinCount = (spinCount + 1) ^ 0xAAA;
}

void UnlockSpin( volatile int * theSpin )
{
*theSpin = 0;
}
Понятно я могу использовать Qt ф-цию (вместо  InterlockedExchange), эффект тот же. Вот как бы мне "прокручиваться" поумнее? Смущает напр Википедия

Цитировать
На современных процессорах цикл ожидания может выполнятся очень быстро за счет особенностей конвейерной архитектуры, что помимо наматывания холостых циклов может приводить к более интенсивному нагреву чем при обычной работе. В Pentium 4 и последующих моделях процессоров Intel введена специальная ассемблерная команда для вставки внутрь цикла pause (опкод 0xf3 0x90) предназначение которой проинструктировать процессор, что данный цикл является циклом ожидания.

Было бы хорошо вместо while задействовать штатную ф-цию (как OSSpinLockLock в OSX). Имеется ли такая?

Спасибо
Записан
spectre71
Гость
« Ответ #1 : Сентябрь 02, 2010, 13:11 »

Может лучше использовать "Critical Section" - Mutex в WIN API.

Цитировать
BOOL WINAPI InitializeCriticalSectionAndSpinCount(
  LPCRITICAL_SECTION lpCriticalSection,
  DWORD dwSpinCount
);

void WINAPI DeleteCriticalSection(
  LPCRITICAL_SECTION lpCriticalSection
);

DWORD WINAPI SetCriticalSectionSpinCount(
  LPCRITICAL_SECTION lpCriticalSection,
  DWORD dwSpinCount
);

void WINAPI EnterCriticalSection(
  LPCRITICAL_SECTION lpCriticalSection
);

BOOL WINAPI TryEnterCriticalSection(
  LPCRITICAL_SECTION lpCriticalSection
);

void WINAPI LeaveCriticalSection(
  LPCRITICAL_SECTION lpCriticalSection
);
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.048 секунд. Запросов: 23.