in src/annoylib.h [1260:1296]
void thread_build(int q, int thread_idx, ThreadedBuildPolicy& threaded_build_policy) {
// Each thread needs its own seed, otherwise each thread would be building the same tree(s)
Random _random(_seed + thread_idx);
vector<S> thread_roots;
while (1) {
if (q == -1) {
threaded_build_policy.lock_n_nodes();
if (_n_nodes >= 2 * _n_items) {
threaded_build_policy.unlock_n_nodes();
break;
}
threaded_build_policy.unlock_n_nodes();
} else {
if (thread_roots.size() >= (size_t)q) {
break;
}
}
if (_verbose) annoylib_showUpdate("pass %zd...\n", thread_roots.size());
vector<S> indices;
threaded_build_policy.lock_shared_nodes();
for (S i = 0; i < _n_items; i++) {
if (_get(i)->n_descendants >= 1) { // Issue #223
indices.push_back(i);
}
}
threaded_build_policy.unlock_shared_nodes();
thread_roots.push_back(_make_tree(indices, true, _random, threaded_build_policy));
}
threaded_build_policy.lock_roots();
_roots.insert(_roots.end(), thread_roots.begin(), thread_roots.end());
threaded_build_policy.unlock_roots();
}