Glib: как начать новый поток, пока другой поток не будет завершен?

Я использую Glib для разработки многопоточного программного обеспечения C.

Хотелось бы иметь набор живых ниток. После завершения одного потока другой поток запускается с другим параметром. Это что-то вроде пула потоков.

Я использую glib thread для реализации многопоточности. Но я не могу найти много руководств от Google. Теперь я могу запустить набор потоков, но понятия не имею об ожидании. Какой-то мой код:

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);
}

person Joy    schedule 11.01.2013    source источник


Ответы (1)


g_thread_join возвращает возвращаемое значение, поэтому вы просто проверяете его. Допустим, вы хотите создать новый процесс, если возвращаемое значение - 17.

for (i = 0; i < n_threads; ++i) {
    if (threads[i] && g_thread_join(threads[i]) == 17) {  
        /* Start a new thread. */
        threads[i] = g_thread_create((GThreadFunc) pe_lib_thread, data + i,
            TRUE, NULL);
    } else {
        threads[i] = NULL;
    }
}
person Klas Lindbäck    schedule 11.01.2013