An acquire fence will prevent loads from being moved before the fence, but will not prevent load from being moved bellow. So your code is equivalent to:
Code:
for(;;)
 {
   __atomic_thread_fence( __ATOMIC_ACQUIRE );
   local_c0 = c0;
   local_c1 = c1;
   if( local_c0 == c0 and local_c1 == c1 )
     if( local_c0 > local_c1 )
       printf( "uh-oh! c0 is %llu and c1 is %llu\n", local_c0, local_c1 );
 }
That's not very useful.

An acquire barrier is not a yield. It does not in any way signal anything to another thread. All it does it prevent your compiler and hardware from reordering instructions and forces memory consistency. At most this may cause a stall on some architectures until cache changes are visible from other cores.