pthreads (8) condition variableを使わない場合

condition variableを使わない場合を考える。この場合は、watch()自身が定期的にリソースの値を確認し、閾値に達するまでスピンする。一応同じ操作は可能だけど、閾値に達するまでずっとスピンしてるってのもCPUに優しくないし、その間何度もmutexのlockとunlockを繰り返すので他のスレッドのパフォーマンスにも影響する。なのでやっぱりsleepさせておくほうがよいかな、という気がします。

void func(int *p)
{
     int i, tmp, id=*p;
     for(i=0; i<ITERATION; i++){
          pthread_mutex_lock(&mutex);
          printf("thread %d: func res=%d\n", id, res);
          tmp = res;
          usleep(1);
          res = tmp + 1;
          pthread_mutex_unlock(&mutex);
     }
}

void watch(int *p)
{
     int id = *p;
     printf("thread %d: watch begin.\n", id);
     pthread_mutex_lock(&mutex);
     while(res < THREASHOLD){
          pthread_mutex_unlock(&mutex);
          usleep(10);
          pthread_mutex_lock(&mutex);
     }
     pthread_mutex_unlock(&mutex);
     printf("thread %d: watch end.\n", id);
}