私はGlib
マルチスレッドCソフトウェアの開発に使用しています。
生きているスレッドのセットが欲しいのですが。一部のスレッドが終了すると、別のスレッドが別のパラメーターで開始します。スレッドプールのようなものです。
マルチスレッドを実装するためにglibスレッドを使用しています。しかし、私はグーグルから多くのチュートリアルを見つけることができません。これで一連のスレッドを開始できますが、待機についてはわかりません。私のいくつかのコード:
GThread *threads[n_threads];
thread_aux_t *data = (thread_aux_t*) calloc(n_threads, sizeof(thread_aux_t));
for (i = 0; i < n_threads; ++i) {
data[i].parameter = i;
threads[i] = g_thread_create((GThreadFunc) pe_lib_thread, data + i,
TRUE, NULL);
}
/* wait for threads to finish */
for (i = 0; i < n_threads; ++i) {
g_thread_join(threads[i]); // How to start a new thread depending on the return value?
}
free(data);
ありがとう。
問題が解決しました。アップデート:
glibのスレッドプール実装が見つかりました:スレッドプール。私はそれを実行しました、そしてそれは正しく働きます。コードは次のように記述されています。
// 'query' is for this new thread,
// 'data' is the global parameters set when initiating the pool
void *pe_lib_thread(gpointer query, gpointer data) {
}
void run_threads() {
GThreadPool *thread_pool = NULL;
// Global parameters by all threads.
thread_aux_t *data = (thread_aux_t*) calloc(1, sizeof(thread_aux_t));
data->shared_hash_table = get_hash_table();
g_thread_init(NULL);
thread_pool = g_thread_pool_new((GFunc) pe_lib_thread, data, n_threads,
TRUE, NULL);
// If n_threads is 10, there are maximum 10 threads running, others are waiting.
for (i = 0; i < n_queries; i++) {
query = &queries[i];
g_thread_pool_push(thread_pool, (gpointer) query, NULL);
}
g_thread_pool_free(thread_pool, 0, 1);
}