Russian Qt Forum

Компиляторы и платформы => Windows => Тема начата: Igors от Июль 05, 2010, 11:01



Название: Штатная ф-ция Spin Lock (Windows) ?
Отправлено: Igors от Июль 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). Имеется ли такая?

Спасибо


Название: Re: Штатная ф-ция Spin Lock (Windows) ?
Отправлено: spectre71 от Сентябрь 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
);