2016-09-30 3 views
0

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

#include <pthread.h> 
#include <stdio.h> 
#include <stdlib.h> 

#define NUM_THREADS 8 

void *printGoGators(void *noArg) 
{ 
    printf("Go Gators!\n"); 
    return NULL; 
} 

int main(int argc, char *argv[]) 
{ 
    pthread_t threads[NUM_THREADS]; 
    int rc, t; 
    for (t = 0; t < NUM_THREADS; t++) 
    { 
     printf("Creating thread %d\n", t); 
     rc = pthread_create(&threads[t], 
       NULL, 
       printGoGators, 
       NULL); 
     if(rc) 
    { 
     printf("ERROR %d", rc); 
     exit(-1); 
    } 
    } 
    pthread_exit(NULL); 
} 

Этот код производит следующий вывод. :

Creating thread 0 
Creating thread 1 
Go Gators! 
Creating thread 2 
Go Gators! 
Creating thread 3 
Go Gators! 
Creating thread 4 
Go Gators! 
Creating thread 5 
Go Gators! 
Creating thread 6 
Go Gators! 
Creating thread 7 
Go Gators! 
Go Gators! 

Почему Go Gators! не печатается непосредственно после его соответствующего Creating thread # для всех потоков? Пожалуйста, помогите!

+2

потому что ваши потоки независимы друг от друга и из основного потока, который их создает. Таким образом, после инициализации вы не можете контролировать, какой поток будет печатать первым. – HazemGomaa

+0

Таким образом, этот вопрос считается слишком широким для stackoverflow. Я не вижу, чтобы кто-нибудь предлагал разные ответы. –

+1

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

ответ

4

Если ваш код выглядел так, то выход будет в порядке, вы ожидаете:

for (t = 0; t < NUM_THREADS; t++) 
    { 
     printf("Creating thread %d\n", t); 
     printGoGators(NULL); 
    } 

Таким образом, вы делаете предположение, что потоки будут выполняться в том же порядке, что они созданы. Однако это предположение неверно - потоки могут выполняться в любом порядке.

1

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

В отличие от принятого ответа, этот пример использует потоки, а не только что-то печатает в цикле.

#include <pthread.h> 
#include <stdio.h> 
#include <stdlib.h> 

#define NUM_THREADS 8 

pthread_mutex_t myMutex;    // Declere global mutex 
pthread_cond_t myCondition;    // Declere global condition 


void *printGoGators(void *arg) {   

    printf("Go Gators! %i\n", *(int*)arg); 
    delete (int*) arg; 

    pthread_cond_signal(&myCondition); // Signal that a condition is met 

    return NULL; 
} 

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

    pthread_mutex_init(&myMutex, NULL);    // Initialize mutex 
    pthread_cond_init (&myCondition, NULL);   // Initialize condition 

    pthread_t threads[NUM_THREADS]; 
    int rc, t; 
    for (t = 0; t < NUM_THREADS; t++) { 

     int* n = new int; 
     *n = t; 

     printf("Creating thread %d\n", t); 
     rc = pthread_create(&threads[t], 
       NULL, 
       printGoGators, 
       n);    

     if(rc) { 
     printf("ERROR %d", rc); 
     exit(-1); 
    } 


    pthread_cond_wait(&myCondition, &myMutex);   // waite for condition 

    } 
    pthread_exit(NULL); 
} 

результат:

Creating thread 0 
Go Gators! 0 
Creating thread 1 
Go Gators! 1 
Creating thread 2 
Go Gators! 2 
Creating thread 3 
Go Gators! 3 
Creating thread 4 
Go Gators! 4 
Creating thread 5 
Go Gators! 5 
Creating thread 6 
Go Gators! 6 
Creating thread 7 
Go Gators! 7 

Основной цикл создания потока: Создать поток, а затем ждать, пока условия.

Новая тема: Распечатайте сообщение, затем сообщите, что условие выполнено.

Таким образом вы управляете порядком исполнения.