El siguiente código produce valores aleatorios para n y v. No es sorprendente que n sea aleatorio sin estar adecuadamente protegido. Pero se supone que v finalmente debería ser 0. ¿Hay algo mal en mi código? ¿O alguien podría explicar esto por mí? Gracias.Las operaciones de atomic.h parecen no ser atómicas
Estoy trabajando en un servidor de 4 núcleos de arquitectura x86. La unme es la siguiente.
Linux 2.6.9-22.ELsmp # 1 SMP Lun Sep 19 de 2005 18:00:54 EDT x86_64 x86_64 x86_64 GNU/Linux
#include <stdio.h>
#include <pthread.h>
#include <asm-x86_64/atomic.h>
int n = 0;
atomic_t v;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
#define LOOP 10000
void* foo(void *p)
{
int i = 0;
for(i = 0; i < LOOP; i++) {
// pthread_mutex_lock(&mutex);
++n;
--n;
atomic_inc(&v);
atomic_dec(&v);
// pthread_mutex_unlock(&mutex);
}
return NULL;
}
#define COUNT 50
int main(int argc, char **argv)
{
int i;
pthread_t pids[COUNT];
pthread_attr_t attr;
pthread_attr_init(&attr);
atomic_set(&v, 0);
for(i = 0; i < COUNT; i++) {
pthread_create(&pids[i], &attr, foo, NULL);
}
for(i = 0; i < COUNT; i++) {
pthread_join(pids[i], NULL);
}
printf("%d\n", n);
printf("%d\n", v);
return 0;
}
No tengo una respuesta, pero me gustaría decir: gracias por hacer una pregunta clara, clara y sin ambigüedades con un código fuente completo. ¡Ojalá todos hicieran eso! – RichieHindle