Anuncios

Bienvenidos sean a este post, hoy hablaremos sobre otro tipo de datos.

Anuncios

En este post mostramos como es la brecha entre las lineas del codigo fuente y ser el posible origen de las carreras de datos. Por eso, si tenemos una operacion con mas de una instruccion, deberias estar alerta ante la posibilidad de un error. Y sin importar cuanto te esfuerces hagamos operaciones independientes y singulares, estas no podran evitar que en algun momento se rompan las operaciones donde se involucran multiples operaciones. Aqui es donde C++ nos da una mano con los tipos atomicos.

Anuncios

A que nos referimos con atomico? Esto es usualmente utilizado para indicar algo que no puede ser descompuesto en piezas mas chicas, esto implica que esta operacion no puede ser a medias: se hace o no se hace. Un ejemplo simple es el siguiente:

num = 22;
Anuncios

Este es una asignacion de un valor entero a una variable. Si dos threads acceden a esta linea de codigo, ninguno de los dos lo encontraran a medio hacer porque no tendremos ninguna brecha en esta asignacion. Pero no quita que esa misma linea puede tener muchas brechas si num representa a un objeto complejo con un operador de asignacion definido por el usuario.

Anuncios

Una operacion no atomica es considerada como a medias. Un ejemplo clasico es una operacion de incremento de la cual hablamos en este post. En C++ todas las operaciones en tipos atomicos son atomicos. Esto significa que podemos evitar brechas entre linea con el uso de tipos atomicos. Una posibilidad que disponemos es la creacion de funciones atomicas mediante mutexes, veamos un ejemplo:

void foo()
{
  mutex.lock();
  int a{41};
  int b{a + 1};
  mutex.unlock();
}
Anuncios
Anuncios

Es muy similar como vinimos viendo hasta ahora, donde primero lo bloqueamos, iniciamos las variables y lo desbloqueamos. Pero la principal diferencia entre estas funciones atomicas y las verdaderas es que no poseen bloqueos. Y esto es asi porque los mecanismos de sincronizacion usualmente agregan penalidades de performance y para ser mas preciso, los tipos atomicos requieren mecanismos de bajo nivel para asegurar la ejecucion independiente y atomica de las instrucciones. Los estandares de tipos atomicos se encuentran definidos en la libreria atomic. A pesar de lo comentado anteriormente, algunos de estos pueden utilizar bloqueos internos pero para asegurarnos que no realizan los bloqueos, la gran mayoria de los tipos atomicos exponen a la funcion is_lock_free.

Anuncios
Anuncios

Esta funcion si la aplicamos a un objeto devolvera un valor booleano. Si las operaciones en el objeto son hechas directamente con instrucciones atomicas nos devuelve un true. En cambio, devuelve false si se usan bloqueos internos. La funcion is_always_lock_free es de tipo static constexpr y devuelve true si todos los tipos atomicos son lock-free para todo el hardware soportado. Y como esta funcion es constexpr, nos permite definir si el tipo es lock-free al momento de compilacion. Esto nos da una gran mano al momento de organizar y ejecutar el codigo en una buena manera, veamos este ejemplo:

std::atomic<int>::is_always_lock_free()
Anuncios

Esto devuelve true porque atomic es mayortariamente siempre lock-free. Si ven la linea anterior, podemos especializar un tipo de dato para atomic pero tambien podemos referenciarlos de otra manera. Veamos la sigueinte tabla:

Tipo atomicoEspecializacion
atomic_boolstd::atomic<bool>
atomic_charstd::atomic<char>
atomic_scharstd::atomic<signed char>
atomic_ucharstd::atomic<unsigned char>
atomic_intstd::atomic<int>
atomic_uintstd::atomic<unsigned>
atomic_shortstd::atomic<short>
atomic_ushortstd::atomic<unsigned short>
atomic_longstd::atomic<long>
atomic_ulongstd::atomic<unsigned long>
atomic_llongstd::atomic<long long>
atomic_ullongstd::atomic<unsigned long long>
atomic_char16_tstd::atomic<char16_t>
atomic_char32_tstd::atomic<char32_t>
atomic_wchar_tstd::atomic<wchar_t>
Anuncios

En la tabla anterior representa tipos basicos atomicos. La diferencia fundamental entre los tipos regulares y los tipos atomicos son los tipos de operaciones que podemos aplicarles pero sobre estas hablaremos en el proximo post.

Anuncios

En resumen, hoy hemos visto tipos atomicos, que son, para que se utilizan, que beneficios poseen, como podemos emularlos y a su vez diferenciarlos. Espero les haya sido de utilidad sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Anuncios

Donación

Es para mantenimento del sitio, gracias!

$1.50