Каков вариант использования для атомарного обмена (чтение-запись)? - PullRequest
7 голосов
/ 10 августа 2011

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

Win32 имеет похожую функцию: InterlockedExchange

Теперь эти операции просты: атомарное чтение-модификация.

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

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

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

1 Ответ

10 голосов
/ 10 августа 2011

Ваш типичный спинлок:

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 очередь без ожидания для реального приложения.

...