Есть ли атомарная операция | =? - PullRequest
7 голосов
/ 25 июня 2011

Есть ли такая вещь, как атомная |= или и атомная или? Если нет, каков рекомендуемый метод установки бита в переменной, которая должна быть поточно-ориентированной? (Я избегаю замков)

Ответы [ 4 ]

6 голосов
/ 25 июня 2011

В C ++ 03 такого нет, но вы можете использовать особенности вашего поставщика. Например, вы можете использовать InterlockedOr в Windows. В C ++ 0x вы можете использовать atomic_fetch_or.

Обратите внимание, что атомарные операции также требуют блокировки, хотя на аппаратном уровне это все еще дорого.

4 голосов
/ 25 июня 2011

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

3 голосов
/ 25 июня 2011

Взгляните на _InterlockedOr свойственную. Это самый быстрый, что вы можете получить.

1 голос
/ 25 июня 2011

В текущем стандарте C ++ такого мнения нет - но будет C ++ 11, который выйдет, вероятно, осенью. См .: http://www.open -std.org / jtc1 / sc22 / wg21 / docs /apers / 2002 / n1401.pdf

Я не уверен, есть ли уже компиляторы, поддерживающие части новых потоковых средств будущего стандарта C ++. В противном случае вам нужно будет обойти это (например, с помощью Boost).

...