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); }