7.25.24. grn_thread_*

7.25.24.1. 概要

スレッド関連のAPIには grn_thread_ プレフィックスがついています。

通常、このAPIを使う必要はありません。

Groongaサーバーを実装するときにこのAPIを使いたくなるかもしれません。

7.25.24.2.

以下は、 groonga 実行ファイル が実際に使っている grn_thread_* APIの使い方です。 groonga 実行ファイル は最大スレッド数を増やすと、スレッドプールのサイズを増やします。一方、 groonga 実行ファイル は最大スレッド数を減らすと、スレッドプールのサイズを減らします。もし、すでに減少後のスレッドプールのサイズ以上のスレッドが動いていたらそれらを止めます。

static grn_mutex q_mutex;
static grn_cond q_cond;
static uint32_t nfthreads;
static uint32_t max_nfthreads;

static uint32_t
groonga_get_thread_limit(void *data)
{
  return max_nfthreads;
}

static void
groonga_set_thread_limit(uint32_t new_limit, void *data)
{
  uint32_t i;
  uint32_t current_nfthreads;

  MUTEX_LOCK(q_mutex);
  current_nfthreads = nfthreads;
  max_nfthreads = new_limit;
  MUTEX_UNLOCK(q_mutex);

  if (current_nfthreads > new_limit) {
    for (i = 0; i < current_nfthreads; i++) {
      MUTEX_LOCK(q_mutex);
      COND_SIGNAL(q_cond);
      MUTEX_UNLOCK(q_mutex);
    }
  }
}

int
main(int argc, char *argv)
{
  /* ... */
  grn_thread_set_get_limit_func(groonga_get_thread_limit, NULL);
  grn_thread_set_set_limit_func(groonga_set_thread_limit, NULL);

  grn_init();

  /* ... */
}

7.25.24.3. リファレンス

typedef uint32_t (*grn_thread_get_limit_func)(void *data)

最大スレッド数を返す関数の型です。

typedef void (*grn_thread_set_limit_func)(uint32_t new_limit, void *data)

最大スレッド数を設定する関数の型です。

uint32_t grn_thread_get_limit(void)

最大スレッド数を返します。

grn_thread_set_get_limit_func()grn_thread_get_limit_func を設定していない場合は、常に 0 を返します。

戻り値:

最大スレッド数または 0

void_t grn_thread_set_limit(uint32_t new_limit)

最大スレッド数を設定します。

grn_thread_set_set_limit_func()grn_thread_set_limit_func を設定していない場合はなにもしません。

パラメータ:
  • new_limit -- 新しい最大スレッド数。

void grn_thread_set_get_limit_func(grn_thread_get_limit_func func, void *data)

最大スレッド数を返すカスタム関数を設定します。

datagrn_thread_get_limit()func を呼ぶときに func に渡されます。

パラメータ:
  • func -- 最大スレッド数を返すカスタム関数。

  • data -- func が呼ばれるときに func に渡されるユーザーのためのデータ。

void grn_thread_set_set_limit_func(grn_thread_set_limit_func func, void *data)

最大スレッド数を設定するカスタム関数を設定します。

datagrn_thread_set_limit()func を呼ぶときに func に渡されます。

パラメータ:
  • func -- 最大スレッド数を設定するカスタム関数。

  • data -- func が呼ばれるときに func に渡されるユーザーのためのデータ。