El C++0x draft tiene una noción de cercas que parece muy distinta de una noción de nivel de CPU/chip de cercas, o decir lo que los tipos de kernel de Linux esperan de fences. La pregunta es si el borrador realmente implica un modelo extremadamente restringido, o la redacción es simplemente pobre y en realidad implica vallas verdaderas.Cercas en C++ 0x, garantías solo en atómicos o memoria en general
Por ejemplo, bajo 29,8 Cercos que afirma cosas como:
Una valla de liberación A se sincroniza con una cerca adquieren B si existen atómicas operaciones X e Y, a la vez funcionando en algunos atómica oponerse M, tal que a es secuenciaron antes de X, X modi fi es H, y es secuenciaron antes de B, e y lee el valor escrito por X o un valor escrito por cualquier lado e ff ect en el hipotético liberación secuencia X haría head si es fueron una operación de lanzamiento.
Utiliza estos términos atomic operations
y atomic object
. Hay tales operaciones y métodos atómicos definidos en el borrador, pero ¿solo significa eso? Una valla de liberación suena como una valla de la tienda . Una valla de la tienda que no garantiza la escritura de todos los datos antes de la valla es casi inútil. Similar para una valla de carga (adquirir) y una valla completa.
Entonces, ¿las cercas/barries en las cercas adecuadas de C++ 0x y la redacción son increíblemente malas, o están extremadamente restringidas/inútiles como se describe?
En términos de C++, decir que tengo el código existente (vallas suponiendo están disponibles tan alto nivel de construcciones de este momento - en vez de, por ejemplo usando __sync_synchronize en GCC):
Thread A:
b = 9;
store_fence();
a = 5;
Thread B:
if(a == 5)
{
load_fence();
c = b;
}
asumir una, b, c son de un tamaño para tener una copia atómica en la plataforma. Lo anterior significa que c
solo se le asignará 9
. Tenga en cuenta que no nos importa cuando el hilo B ve a==5
, solo que cuando lo hace también ve b==9
.
¿Cuál es el código en C++ 0x que garantiza la misma relación?
RESPUESTA: Si usted lee mi respuesta elegida y todos los comentarios que obtendrá la esencia de la situación. C++ 0x parece forzarlo a usar un atómico con vallas, mientras que una valla de hardware normal no tiene este requisito. En muchos casos, esto todavía se puede usar para reemplazar algoritmos concurrentes siempre que sizeof(atomic<T>) == sizeof(T)
y atomic<T>.is_lock_free() == true
.
Sin embargo, es lamentable que is_lock_free
no sea un constexpr. Eso permitiría su uso en un static_assert
. Tener atomic<T>
degenerado para usar bloqueos generalmente es una mala idea: los algoritmos atómicos que usan mutex tendrán problemas de conflicto terribles en comparación con un algoritmo diseñado por mutex.
El uranio empobrecido se ha desplazado como el material de elección para los proyectiles de artillería. Las copias obsoletas del borrador de C++ 0x resultaron ser más densas. –
Aunque ese solo tiene un mes o algo así. –
Hans podría saber algo que nosotros no? La propuesta ** real ** para C++ 11 será lanzada la próxima semana. –