pthread_join и pthread странное поведение - PullRequest
0 голосов
/ 21 апреля 2020

У меня есть 2 процесса, каждый из которых создает несколько потоков (2 в этом примере) с помощью кода ниже. Когда я помещаю pthread_join прямо внизу create, он работает, но всегда вызывает потоки по порядку. Я хочу сделать соединения в другом l oop, как показано ниже. Проблема в том, что когда я делаю это, по какой-то причине он создает дубликаты одного и того же потока вместо двух разных потоков.

Поэтому, когда поток запускается, он печатает что-то вроде: «Поток 2.2 запущен Поток 2.2 запущен Поток 1.2 запущен Поток 1.2 запущен» Где первый номер - это номер процесса, а второй - номер потока. Они должны быть «1.2 1.1 2.1 2.2». Может кто-нибудь помочь, пожалуйста?

for(int i = 0; i<num_of_t;i++){
        struct threadst args;
        args.globalcp = globalcp;
        args.lock = lock;
        args.num1 = num1+i*((num2-num1+1)/num_of_t);
        args.num2 = args.num1+((num2-num1+1)/num_of_t)-1;
        args.threadid =i;
        args.pid = myOrder;
        pthread_create(&threads[i], &attr, findPrimes, (void *)&args);
        pthread_join(threads[i], &status);
    }

    //for(int i = 0; i<num_of_t;i++){
        //pthread_join(threads[i], &status);
    //}

1 Ответ

2 голосов
/ 21 апреля 2020

Во-первых, вы передаете один и тот же объект при каждом создании потока (&args), таким образом, он используется всеми потоками. Так что дайте каждому свое, как вам нужно.

Во-вторых, не вызывайте pthread_join сразу после создания потока, иначе вы снова введете последовательность (объединение - это блокирующая операция, ожидающая конца потока). Обычно вам нужно запускать ваши потоки, и в какой-то последующий момент позже вызовите join для потоков, вам нужно подождать.

// create an array of args to be passed each for a given thread
struct threadst *args = malloc(sizeof(struct threadst)*num_of_t;
// need a test for malloc...

for(int i = 0; i<num_of_t;i++){
    struct threadst *arg = args+i;
    arg->globalcp = globalcp;
    arg->lock     = lock;
    arg->num1     = num1+i*((num2-num1+1)/num_of_t);
    arg->num2     = arg->num1+((num2-num1+1)/num_of_t)-1;
    arg->threadid = i;
    arg->pid      = myOrder;
    pthread_create(&threads[i], &attr, findPrimes, (void *)arg);
}

// do something else in the meantime

for (int i = 0; i<num_of_t;i++) {
    pthread_join(threads[i], &status);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...