void lock(void)
{
int c;
if ((c = cmpxchg (val, 0, 1)) != 0) {
if (c != 2)
c = xchg (val, 2);
while (c != 0) {
futex_wait (&val, 2);
c = xchg (val, 2);
}
}
}
...
fork();
pthread_create(..);
...