#include #include #include #include #include #include #include pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; int v[4]; unsigned long counts[4]; unsigned long count; void* thread(void* X) { const int mine=(uintptr_t)X; for (;;) { pthread_mutex_lock(&lock); v[mine]=1; if (v[0]+v[1]+v[2]+v[3]!=1) { write(1,"KAPUTT!\n",8); exit(1); } v[mine]=0; ++counts[mine]; if (++count%1000000==0) { char buf[100]; sprintf(buf,"%d \r",count); write(1,buf,strlen(buf)); } pthread_mutex_unlock(&lock); } } int main() { pthread_t p[4]; pthread_mutex_lock(&lock); pthread_mutex_unlock(&lock); puts("This test runs for 5 seconds (or it fails early)."); pthread_create(&p[0],0,thread,(void*)0); pthread_create(&p[1],0,thread,(void*)1); pthread_create(&p[2],0,thread,(void*)2); pthread_create(&p[3],0,thread,(void*)3); sleep(5); printf("%lu iterations: %lu %lu %lu %lu.\n",count,counts[0],counts[1],counts[2],counts[3]); exit(0); }