operaciones atómicas de bajo nivel. Estos son esencialmente mutex implementados en hardware, excepto que solo puede realizar unas pocas operaciones de forma atómica.
Considérese el siguiente pseudocódigo equivalente:
mutex global_mutex;
void InterlockedAdd(int& dest, int value) {
scoped_lock lock(mutex);
dest += value;
}
int InterlockedRead(int& src) {
scoped_lock lock(mutex);
return src;
}
void InterlockedWrite(int& dest, int value) {
scoped_lock lock(mutex);
dest = value;
}
Estas funciones se implementan como instrucciones de la CPU, y garantizar la coherencia entre los hilos en diversos grados. La semántica exacta depende de la CPU en cuestión. x86 ofrece consistencia secuencial. Esto significa que las operaciones actúan como si hubieran sido emitidas secuencialmente, en algún orden. Esto obviamente implica bloquear un poco.
Puede conjeturar con precisión que las operaciones atómicas se pueden implementar en términos de mutexes, o viceversa. Pero, por lo general, las operaciones atómicas son proporcionadas por el hardware, y luego mutexes y otras primitivas de sincronización implementadas sobre ellas por el sistema operativo. Esto se debe a que hay algunos algoritmos que no requieren un mutex completo y que pueden operar lo que se conoce como "sin bloqueo", lo que significa simplemente usar operaciones atómicas para lograr cierta coherencia entre hilos.
Esto no responde la pregunta. ¿Qué sucede si dos subprocesos "leen y intercambian" al mismo tiempo? Entonces ambos regresan 0. – user1146657
@ user1146657: El punto de la operación de "bloqueo e intercambio" es que es * atómico *, y la (s) CPU (s) aseguran que solo un hilo puede hacerlo en cualquier momento dado. Entonces, por definición, dos hilos * no pueden * hacerlo al mismo tiempo. La CPU está específicamente diseñada para funcionar de esa manera exactamente para este propósito. –