Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Про Interlocked фунцкии, Синхронизация итд. 
:(
    Опции темы
0xDEAD
Дата 11.9.2011, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 20.9.2009

Репутация: 3
Всего: 3



Добрый день.

Я тут читаю про синхронизацию между потоками процесса, и на msdn есть такой пример:
http://msdn.microsoft.com/en-us/library/ms686355(VS.85).aspx

Они пишут что так писать не thread-safe:
Код

int iValue;
BOOL fValueHasBeenComputed = FALSE;
extern int ComputeValue();

void CacheComputedValue()
{
  if (!fValueHasBeenComputed) 
  {
    iValue = ComputeValue();
    fValueHasBeenComputed = TRUE;
  }
}
 
BOOL FetchComputedValue(int *piResult)
{
  if (fValueHasBeenComputed) 
  {
    *piResult = iValue;
    return TRUE;
  } 

  else return FALSE;
}


И по этому лучше писать так:
Код

int iValue;
BOOL fValueHasBeenComputed = FALSE;
extern int ComputeValue();

void CacheComputedValue()
{
  if (InterlockedCompareExchange((LONG*)&fValueHasBeenComputed, 
          (LONG) fValueHasBeenComputed, 
          (LONG) fValueHasBeenComputed)==FALSE) 
  {
    InterlockedExchange ((LONG*)&iValue, (LONG)ComputeValue());
    InterlockedExchange ((LONG*)&fValueHasBeenComputed, TRUE);
  }
}
 
BOOL FetchComputedValue(int *piResult)
{
  if (InterlockedCompareExchange((LONG*)&fValueHasBeenComputed, 
          (LONG) fValueHasBeenComputed, 
          (LONG) fValueHasBeenComputed)==TRUE) 
  {
    InterlockedExchange((LONG*)piResult, (LONG)iValue);
    return TRUE;
  } 

  else return FALSE;
}


Зачем нужны InterlockedExchange мне понятно, но вот насчет InterlockedCompareExchange...
Во первых, по моему это по мухе с пулемета, и сравнивать и писать то же значение только для того, чтобы еще раз сравнить.
Во вторых, нужно ли оно тут вообще?
if(fValueHasBeenComputed) ведь только один раз читает память, что есть, как я понимаю, атомная операция.

PM MAIL   Вверх
volatile
Дата 12.9.2011, 00:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 13
Всего: 85



Цитата(0xDEAD @  11.9.2011,  20:40 Найти цитируемый пост)
лучше писать так:

Если внимательно почитать статью, то так писать лучше лишь в 2003 студии.
А в 2005 уже можно писать без InterlockedExchange, достаточно только объявить переменные volatile.
Цитата

With Visual Studio 2005, the compiler uses acquire semantics for read operations on volatile variables and release semantics for write operations on volatile variables (when supported by the CPU).


Если у вас 2003, стоит задуматься над переходом на более свежую версию компилятора.

Это сообщение отредактировал(а) volatile - 12.9.2011, 00:30
PM MAIL   Вверх
0xDEAD
Дата 28.9.2011, 10:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 20.9.2009

Репутация: 3
Всего: 3



Хм, я не совсем понимаю.
Написано:
* the compiler will not re-order volatile variable access. However, these operations could be re-ordered by the processor.
* With Visual Studio 2005, the compiler uses acquire semantics for read operations on volatile variables and release semantics for write operations on volatile variables.

То есть:
* Компилятор компилирует volatile в точно такой же последовательности, как написано в коде. Но несмотря на это, процессор может изменить эту последовательность.
* VS 2005 использует acquire/release semantics (если я правильно понял, речь о LOCK командах) с volatile.

Так вот, я пользуюсь VS 2010. Я скомпилировал первый код, с volatile, но никаких LOCK-ов в компилированном коде нету.

Правильно ли я понимаю значение acquire/release semantics в тексте, и фразу "operations could be re-ordered by the processor"?
PM MAIL   Вверх
volatile
Дата 28.9.2011, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 13
Всего: 85



Цитата(0xDEAD @  28.9.2011,  10:39 Найти цитируемый пост)
если я правильно понял, речь о LOCK командах

Не обязательно.

Код

  The processor uses three interdependent mechanisms for  carrying  out  locked
atomic operations:
  • Guaranteed atomic operations
  • Bus locking, using the LOCK# signal and the LOCK instruction prefix
  • Cache coherency protocols that insure that atomic operations can be carried
out on cached data structures (cache lock); this mechanism is  present  in  the
Pentium 4, Intel Xeon, and P6 family processors


Цитата(0xDEAD @  28.9.2011,  10:39 Найти цитируемый пост)
но никаких LOCK-ов в компилированном коде нету.

Ну во-первых может быть, они в вашем конкретном случае и не нужны.  smile 
вот здесь объясняется подобный случай.

 
PM MAIL   Вверх
0xDEAD
Дата 28.9.2011, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 20.9.2009

Репутация: 3
Всего: 3



ОК, я понял что тема эта не простая.
Тут есть два понятия:
* Атомарность.
* Последовательность обновления значений для других процессоров.

volatile гарантирует последовательность обновления значений - то есть что iValue обновится перед fValueHasBeenComputed, а не наоборот.
А атомарность в этом случае гарантированна, потому что чтение/запись из/в выравненный DWORD есть "Guaranteed atomic operation".

Интересная ссылка:
http://stackoverflow.com/questions/5002046...myth-or-reality
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0904 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.