/* * Autor: Renan Adriani Sterle * * Verificar erro do incremento utilizando gbd. * (gdb) set non-stop off * (gdb) break 25 * (gdb) break 39 * (gdb) run * (gdb) info threads * (gdb) ... (próximos comandos irão variar conforme a execução) */ #include #include #include #include volatile int Counter = 5; void *IncrementB() { int C = Counter; //Counter++ in assembly: asm("movl Counter(%rip), %ebx\n"); asm("addl $1, %ebx\n"); asm("movl %ebx, Counter(%rip)\n"); printf("IncrementB: %d + 1 = %d\n", C, Counter); return NULL; } void *IncrementA() { int C = Counter; //Interrupted Counter++ in assembly: asm("movl Counter(%rip), %ebx\n"); asm("addl $1, %ebx\n"); asm("movl %ebx, Counter(%rip)\n"); printf("IncrementA: %d + 1 = %d\n", C, Counter); return NULL; } int main () { pthread_t ThreadA, ThreadB; pthread_create(&ThreadA, NULL, IncrementA, NULL); pthread_create(&ThreadB, NULL, IncrementB, NULL); pthread_join(ThreadA, NULL); pthread_join(ThreadB, NULL); printf("Final Counter: %d\n", Counter); return 0; }