本文へスキップ
`Ctrl`+`K`

# 7.26.1.24. `grn_thread_*`

## 7.26.1.24.1. 概要

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

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

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

## 7.26.1.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.26.1.24.3. リファレンス

注釈

現在、Doxygenを使った自動生成に切り替え中です。