環境はLinux + pthreadで、

/* pthread_createに渡す関数 */
void* thread_func(void* arg)
{
  int* sd = arg;  /* sd: ソケットディスクリプタ */
  char c;

  while (1) {
    int result = read(sd, &c, 1);

    if (result == 1) {
      fputc(c, stdout);
    } else if (result == 0) {
      usleep(WAIT_MSEC);
      continue;
    } else {
      perror("read on thread_func");
      pthread_exit(NULL);
    }
  }
}

…としています。ソケットにデータが流れてきた時にreadするように書きたいのですが、
usleepを使う以外の方法はありますか?