Черновик C ++ 0x имеет понятие ограждений, которое кажется очень отличным от понятия ограждений на уровне процессора / чипа или того, что ребята из ядра Linux ожидают от ограждений, Вопрос в том, действительно ли проект подразумевает крайне ограниченную модель, или формулировка просто плохая, и на самом деле она подразумевает настоящие ограждения.
Например, под 29,8 Заборами в нем указаны такие вещи, как:
Забор А синхронизируется с
приобрести забор B, если существуют атомные
операции X и Y, обе работают на
некоторый атомный объект М, такой, что А является
секвенируется перед X, X изменяет M, Y
последовательность перед B, и Y читает
значение написано X или значение написано
любой стороной эффекта в гипотетическом
последовательность выпуска X будет возглавлять, если это
были операции освобождения.
Используются эти термины atomic operations
и atomic object
. Есть такие атомарные операции и методы, определенные в проекте, но означает ли это только те? A разделительный забор звучит как магазинный забор . хранить забор , который не гарантирует запись всех данных до забора, практически бесполезен. Похоже на загрузочный (полный) забор и полный забор.
Итак, являются ли заборы / ограждения в собственных заборах C ++ 0x и формулировки просто невероятно плохими, или они чрезвычайно ограничены / бесполезны, как описано?
С точки зрения C ++, скажем, у меня есть этот существующий код (при условии, что заборы доступны как конструкции высокого уровня прямо сейчас - вместо того, чтобы, скажем, использовать __sync_synchronize в GCC):
Thread A:
b = 9;
store_fence();
a = 5;
Thread B:
if( a == 5 )
{
load_fence();
c = b;
}
Предположим, что a, b, c имеют размер, чтобы иметь атомную копию на платформе. Вышеуказанное означает, что c
будет назначено только 9
. Обратите внимание, что нам все равно, когда поток B видит a==5
, просто когда он это делает, он также видит b==9
.
Какой код в C ++ 0x гарантирует такое же отношение?
ОТВЕТ : Если вы прочитаете мой выбранный ответ и все комментарии, вы получите суть ситуации. C ++ 0x, по-видимому, заставляет вас использовать атомарный элемент с заборами, тогда как обычный аппаратный забор не имеет этого требования. Во многих случаях это все еще можно использовать для замены параллельных алгоритмов, если sizeof(atomic<T>) == sizeof(T)
и atomic<T>.is_lock_free() == true
.
К сожалению, is_lock_free
не является контрагентом. Это позволило бы использовать его в static_assert
. Дегенерация atomic<T>
до использования блокировок, как правило, плохая идея: атомарные алгоритмы, использующие мьютексы, будут иметь ужасные проблемы конкуренции по сравнению с алгоритмом, разработанным мьютексами.