# groonga - オープンソースのカラムストア機能付き全文検索エンジン

- English

# 7.21.23. `grn_thread_*`

## 7.21.23.1. 概要

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

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

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

## 7.21.23.2. 例

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

    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.21.23.3. リファレンス

uint32_t `(*grn_thread_get_limit_func)`(void *data)

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

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)

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

  `data` は `grn_thread_get_limit()` が `func` を呼ぶときに `func` に渡されます。

  パラメタ: | func -- 最大スレッド数を返すカスタム関数。 data -- `func` が呼ばれるときに `func` に渡されるユーザーのためのデータ。

void `grn_thread_set_set_limit_func`(grn_thread_set_limit_func func, void *data)

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

  `data` は `grn_thread_set_limit()` が `func` を呼ぶときに `func` に渡されます。

  パラメタ: | func -- 最大スレッド数を設定するカスタム関数。 data -- `func` が呼ばれるときに `func` に渡されるユーザーのためのデータ。