shared memory consistency models a tutorial