sort new llenar initialize ejemplos como arreglos c++ arrays multithreading vector atomic

new - ¿Es posible crear un vector o matriz atómica en C++?



sort vector c++ (2)

En la práctica, a nivel de CPU, hay instrucciones que pueden actualizar atómicamente un int , y un buen compilador las usará para std::atomic<int> . En contraste, no hay instrucciones que puedan actualizar atómicamente un vector de ints (para cualquier arquitectura que conozca), por lo que tiene que haber un mutex de algún tipo en algún lugar. Bien podrías dejar que sea tu mutex.

Para futuros lectores que aún no han escrito código con el mutex:

No puedes crear un std::atomic de int[10] , porque eso conduce a una función que devuelve una matriz, y no puedes tenerlos. Lo que puedes hacer es tener un std::atomic<std::array<int,10>>

int main() { std::atomic<std::array<int,10>> myArray; }

Tenga en cuenta que el compilador / biblioteca creará un mutex bajo el capó para hacer esto atómico. Tenga en cuenta además que esto no hace lo que quiere. Te permite establecer el valor de toda la matriz de forma atómica.

No le permite leer la matriz completa, actualizar un elemento y escribir la matriz completa de forma atómica.

Las lecturas y las escrituras serán individualmente atómicas, pero otro hilo puede interponerse entre la lectura y la escritura.

Necesitas el mutex!

Tengo un código que utiliza una matriz de int ( int[] ) en un subproceso que se activa cada segundo.

Uso lock() de std::mutex para bloquear esta matriz en este hilo.

Sin embargo, me pregunto si hay una manera de crear una matriz atómica (o vector) para evitar el uso de un mutex. He intentado un par de maneras, pero el compilador siempre se queja de alguna manera?

Sé que hay una manera de crear una matriz de atomics pero esto no es lo mismo.


Puedes poner matrices en atomics, pero no directamente. Al igual que la otra respuesta, explica que puedes usar std::array . Respondí esta pregunta y expliqué cómo hacer algo similar para una estructura.

Habiendo dicho eso y explicado la viabilidad técnica, tengo que decirles algo más:

Por favor no hagas eso

El poder de las variables atómicas proviene del hecho de que algunos procesadores pueden realizar sus operaciones con una sola instrucción. El compilador de C ++ intentará hacer que sus operaciones atómicas ocurran en una instrucción. Si falla, iniciará un bloqueo de bus , que es como un bloqueo global de todo, hasta que esa matriz se actualice. Es equivalente a un mutex que bloquea todas sus variables en su programa. Si te preocupa el rendimiento, ¡no hagas eso!

Entonces, para tu caso, un mutex no es una mala idea. Al menos puedes controlar lo que es crítico y mejorar el rendimiento.