Каков вариант использования для операции atomic exchange (read-write)?

C++0x указывает std::atomic шаблон для потокобезопасного атомарного доступа к переменным. Этот шаблон имеет, среди прочего, функцию-член std::atomic:: exchange это атомарно сохраняет новое значение в "this "и извлекает существующее значение"this".

Win32 имеет аналогичную функцию: InterlockedExchange

теперь, что эти операции делают просто: atomic read-modify.

то, что я не понимаю, что точка этой операции. Возвращаемое значение "бессмысленно", потому что как только я смогу проверить возвращаемое значение, другой поток, возможно, уже перезаписал его.

Итак, какой вариант использования для этого? что может сказать мне информация о том, какое значение было перед тем, как я написал свое новое значение в переменную?

Примечание:compare_exchange / InterlockedCompareExchange семантика имеет смысл для меня, но не простая семантика обмена.

1 ответов


ваш типичный spinlock:

std::atomic<bool> lock;  // initialize to false

{ // some critical section, trying to get the lock:

  while (lock.exchange(true)) { }  // now we have the lock

  /* do stuff */

  lock = false; // release lock
}

см. Herb Sutter's подождите-свободная очередь для реального приложения.