2012-05-18 2 views
1

я прочитал книгу, которая даст следующий код:Posix/Thread с присоединиться

void *printme(void *id) { 
    int *i; 
    i = (int *)id; 
    printf("Hi. I'm thread %d\n", *i); 
    return NULL; 
} 

void main() { 
    int i, vals[4]; 
    pthread_t tids[4]; 
    void *retval; 
    for (i = 0; i < 4; i++) { 
     vals[i] = i; 
     pthread_create(tids+i, NULL, printme, vals+i); 
    } 
    for (i = 0; i < 4; i++) { 
     printf("Trying to join with tid%d\n", i); 
     pthread_join(tids[i], &retval); 
     printf("Joined with tid%d\n", i); 
    } 
} 

и следующий возможный вывод:

Trying to join with tid0 
Hi. I'm thread 0 
Hi. I'm thread 1 
Hi. I'm thread 2 
Hi. I'm thread 3 
Joined with tid0 
Trying to join with tid1 
Joined with tid1 
Trying to join with tid2 
Joined with tid2 
Trying to join with tid3 
Joined with tid3 

И я не понимаю, как это возможно. Начнем с основного потока и создадим 4 потока: tids[0]... tids[3]. Затем мы приостанавливаем выполнение (по команде объединения): основной поток будет ждать, что tids[0] остановит выполнение, tids[0] будет ждать до tids[1] и так далее.

Так вывод должен быть:

Hi. I'm thread 0 
Hi. I'm thread 1 
Hi. I'm thread 2 
Hi. I'm thread 3 
Trying to join with tid0 
Trying to join with tid1 
Joined with tid0 
Trying to join with tid2 
Joined with tid1 
Trying to join with tid3 
Joined with tid2 
Joined with tid3 

Я чувствую, что я не понимаю, что-то на самом деле основной. Благодарю.

ответ

2

Я думаю, что вам не хватает pthread_create очень отличается от fork. Созданный поток начинается с поставленной функции (printme, в этом случае) и завершается, как только эта функция возвращается. Следовательно, ни один из вновь созданных потоков никогда не достигает второго цикла for.

+0

В потоках есть другое пространство выполнения, они просто выполняют функцию, и они не ожидали достижения второго цикла, их выполнение будет только printme. Они не гарантированы для работы в любом порядке, поэтому в этом случае все потоки создаются, а управление все еще находится в основном потоке. Когда соединение вызывается, оно переходит в режим сна, и любой произвольный поток работает. Он возвращает и освобождает соединение на себе. – Mustafa

2

Когда вы создаете новый поток pthread_create, то оба потока # 1 и main работают параллельно. Main переходит к следующей инструкции, которая является phtread_join и зависает, пока нить # 1 не закончится. Вот почему вы пытаетесь присоединиться к tid0, а затем привет, я - нить # 1.

Также обратите внимание, что основной поток присоединяется к дочерним потокам в указанном порядке. Это означает, что когда у вас есть нить # 1, поток # 2 и поток # 3 и поток 1 занимают 10 секунд для выполнения, поток 2 занимает 6 секунд для выполнения, а поток 3 занимает 7 секунд для выполнения, тогда первое соединение будет выполнено после 10 секунд, а затем за несколько миллисекунд вы должны иметь следующие соединения, так как все остальные нити должны заканчивать работу.

Смежные вопросы