std:: kill_dependency
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Definido en el encabezado
<atomic>
|
||
|
template
<
class
T
>
T kill_dependency ( T y ) noexcept ; |
(desde C++11)
(constexpr desde C++26) (obsoleto en C++26) |
|
|
Informa al compilador que el árbol de dependencias iniciado por una operación de carga atómica
std::memory_order_consume
no se extiende más allá del valor de retorno de
Esto puede utilizarse para evitar barreras
std::memory_order_acquire
innecesarias cuando la cadena de dependencias sale del ámbito de la función (y la función no tiene el atributo
|
(until C++26) |
|
Simplemente retorna y . Esta plantilla de función está obsoleta. |
(since C++26) |
Contenidos |
Parámetros
| y | - | la expresión cuyo valor de retorno debe eliminarse de un árbol de dependencias |
Valor de retorno
Devuelve y , que ya no forma parte de un árbol de dependencias (hasta C++26) .
Ejemplos
file1.cpp:
struct Foo { int* a; int* b; }; std::atomic<Foo*> foo_head[10]; int foo_array[10][10]; // la operación consume inicia una cadena de dependencia, que escapa de esta función [[carries_dependency]] Foo* f(int i) { return foo_head[i].load(memory_order_consume); } // la cadena de dependencia entra en esta función a través del parámetro derecho y se // elimina antes de que finalice la función (por lo que no ocurre ninguna operación de adquisición adicional) int g(int* x, int* y [[carries_dependency]]) { return std::kill_dependency(foo_array[*x][*y]); }
file2.cpp:
[[carries_dependency]] struct Foo* f(int i); int g(int* x, int* y [[carries_dependency]]); int c = 3; void h(int i) { Foo* p; p = f(i); // la cadena de dependencia iniciada dentro de f continúa en p sin adquisición indebida do_something_with(g(&c, p->a)); // p->b no se carga desde la caché do_something_with(g(p->a, &c)); // el argumento izquierdo no tiene el atributo carries_dependency // puede emitirse una barrera de adquisición de memoria // p->b se vuelve visible antes de que se ingrese a g() }
Véase también
|
(C++11)
|
define las restricciones de ordenamiento de memoria para la operación atómica dada
(enum) |
|
C documentation
para
kill_dependency
|
|