【将棋】適当並列化

適当ですが、わりとすんなりできました。
ルートで長男ノードを探索して残りを並列探索です。
CPU使用率が13%から50%くらいになったので効率はともかく、とりあえず満足。
複数のスレッドがハッシュに書き込むので、たまにおかしくなっている気がするけど
とりあえず、まだロック処理は考えていない。
今のところ、ハッシュサイズを大きくして、ハッシュ手が合法かのみをチェック。
以下は大雑把なコードのイメージです。
最初に全手を生成して、各スレッドが次に処理する手を取得+探索という感じです。

// グローバルにルート手情報をもつ
int g_te[600];
int g_num;
int g_i;
int g_alpha;

// 次に処理する手を取得+探索。なければ0を返す。
int proc_te()
{
   if(g_i >= g_num)
      return 0;
   g_te[g_i++]で探索。g_alpha更新。
   return 1;
};
// スレッド処理
int thread()
{
   while(proc_te()){;}
   return 0;
}
// マスターメイン
void master()
{
   // ルートの全ての指し手を生成・オーダリング
   g_num = gen_all_moves();
   // 長男探索
   g_alpha = search(g_te[0]);g_i++;
   // スレッド処理
   thread()をスレッド数だけ起動。
   // マスター処理
   while(proc_te()){;}
}