Поток немедленно выполняется после pthread_create? - PullRequest
0 голосов
/ 30 ноября 2018

Когда я создаю потоки T, у меня есть следующий код в основном потоке.

pthread_t threads[T];
for (a=0; a<T; a++) {
    pthread_create(&(threads[a]), NULL, foo(threads, locks, transition), NULL);
}
printf("in main thread\n");

Он создает первый поток, и я заметил, что он немедленно начинает выполнять первый поток.foo вызывается для первого потока, а "в основном потоке" выводится после.Моим реальным намерением было сначала создать все потоки T (помещая потоки в «готовую» очередь), а затем продолжить выполнение кода в основном потоке, пока он не завершится или не завершится.После выхода из основного режима я хочу, чтобы один из потоков T выполнялся.

В функции foo:

void foo(pthread_t *threads, pthread_mutex_t **locks, double **transition) {
    printf("in foo\n");
}

В функции main_thread:

void main_thread (int *N, int *T) {
    double **transition;
    pthread_mutex_t **locks;

    transition = malloc(*N * sizeof *transition);
    locks = malloc(*N * sizeof *locks);
    for (a=0; a< *N; a++) {
        transition[a] = malloc(*N * sizeof *transition[a]);
        locks[a] = malloc(*N * sizeof *locks[a]);
    }

    // lock for each element in transition matrix
    for (a=0; a<*N; a++) {
        for (b=0; b<*N; b++) {
            if (pthread_mutex_init(&(locks[a][b]), NULL) != 0) { 
                printf("\n mutex init has failed\n"); 
            }
        }
    }

    for (a=0; a<*N; a++) {
        for (b=0; b<*N; b++) {
            transition[a][b] = 0.0;
        }
    }

    pthread_t threads[T];
    for (a=0; a<T; a++) {
        pthread_create(&(threads[a]), NULL, foo(threads, locks, transition), NULL);
    }
    printf("in main thread\n");


}

В главномфункция:

int main(int argc, char *argv[]) {

    int N = 4;
    int T = 2;

    pthread_t main_t;
    pthread_create(&main_t, NULL, &main_thread(&N, &T), NULL); 

    return 0;
}

1 Ответ

0 голосов
/ 30 ноября 2018

С foo(...) вы вызываете функцию, передавая результат ее функции pthread_create.Это означает, что функция будет выполняться до создания любого потока.

Вместо этого вам нужно передать указатель на функцию потока:

pthread_create(&threads[a], NULL, foo, NULL);

Также обратите вниманиечто при выходе из функции main это обычно приводит к завершению всего процесса, что приведет к уничтожению всех запущенных вами потоков.

Если вы хотите, чтобы потоки продолжали работать после выхода из основного потока thread тогда вам нужно использовать pthread_exit из основного потока и отсоединить созданные вами потоки.

И чтобы не запускать потоки сразу, в IIRC есть атрибуты, которые вы можете установитьи передайте функцию pthread_create (второй аргумент), чтобы запустить потоки как приостановленные.Вы должны явно возобновить потоки, но это не произойдет автоматически.

...