Как объединить несколько потоков в ядре Linux - PullRequest
0 голосов
/ 13 февраля 2019

Как я могу убедиться, что несколько потоков в ядре Linux завершены, прежде чем продолжить?

См. Пример кода (слегка измененный) из предыдущего вопроса ( Как присоединиться к потоку в ядре Linux? )

void *func(void *arg) {
    // doing something
    return NULL;
}

int init_module(void) {
    struct task_struct* thread[5];
    int i;

    for (i=0; i<5; i++) {
        thread[i] = kthread_run(func, (void*) arg, "TestThread");
        wake_up_process(thread[i]);
    }

    // wait here until all 5 threads are complete

    // do something else

    return 0;
}

Ответ из этого предыдущего вопросадостаточно подробно (https://stackoverflow.com/a/29961182/7431886),, что здорово, но оно касается только объема исходного вопроса (ожидание завершения только одного из потоков).

Как можно обобщить либоСемафор или методы завершения, подробно описанные в этом ответе, ожидают N потоков, а не только конкретный?

1 Ответ

0 голосов
/ 01 апреля 2019

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

struct my_thread_data {
    struct completion *comp;
    ... // anything else you want to pass through
};

void *foo(void *arg) {
    // doing something
    return NULL;
}

int init_module(void) {
    struct task_struct *threads[5];
    struct completion comps[5];
    struct my_thread_data data[5];

    int i;

    for (i=0; i<5; i++) {
        init_completion(comps + i);
        data[i].comp = comps + i;
        thread[i] = kthread_run(&foo, (void*)(data + i), "ThreadName");
    }

    // wait here until all 5 threads are complete
    for (i=0; i<5; i++) {                                                                             
        wait_for_completion(comps + i);                                                                                                                
    }

    // do something else once threads are complete

    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...