/* * Autor: Renan Adriani Sterle */ #include #include #include #include volatile int Counter = 5; void *IncrementB() { int C = Counter; //Counter++ in assembly: asm("movl Counter(%rip), %ebx\n" "addl $1, %ebx\n" "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" "addl $1, %ebx\n"); sleep(1); 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; }