#include #include #include /* Simple demonstration of lockset tracking at byte granularity. */ char bytes[10]; void* child_fn ( void* arg ) { int i; for (i = 0; i < 5; i++) bytes[2*i + 0] ++; /* child accesses: 0 2 4 6 8 */ return NULL; } int main ( void ) { const struct timespec delay = { 0, 100 * 1000 * 1000 }; int i; pthread_t child; if (pthread_create(&child, NULL, child_fn, NULL)) { perror("pthread_create"); exit(1); } nanosleep(&delay, 0); /* Unprotected relative to child, but harmless, since different bytes accessed */ for (i = 0; i < 5; i++) bytes[2*i + 1] ++; /* accesses: 1 3 5 7 9 */ /* Unprotected relative to child, but harmful; same bytes */ for (i = 0; i < 3; i++) bytes[3*i + 1] ++; /* accesses: 1 4(race!) 7 */ if (pthread_join(child, NULL)) { perror("pthread join"); exit(1); } return 0; }