2011-07-11 3 views
1

Я подхожу к программированию на C с помощью потоков, и я не могу заставить эту программу работать правильно. В основном существует вектор с k элементами, n потоками, и каждый поток должен вычислять max на его k/n элементах.Ошибка выполнения темы

Мой код (обратите внимание, что это не весь код):

// Struct code used later 
struct maxStruct 
{ 
    double *vettore; 
    int dimensione; 
}; 

// Gathering data input from user 

[ . . . ] 
vector = (double *) malloc (dimensione * sizeof(double)); 
pid_thread = (int *) malloc (numero_thread * sizeof(int)); 
thread = (pthread_t *) malloc (numero_thread * sizeof(pthread_t)); 

// Generating the vector 

[ . . . ] 
for (i = 0; i < numero_thread; i++) 
    { 
     e = generaStruct(i, vettore, dimensione, numero_thread); 
     if (status = pthread_create(&thread[i], NULL, calcolaMassimo, (void *) e)) 
       { 
        pthread_perror("pthread_join", status); 
        exit(1); 
       } 
    } 

//Note that the function doesn't calculate the max, I've coded it in this way 
//in order to see whether it was being called by each thread and apparently it is not. 
void *calcolaMassimo(void * e) 
{ 
    printf("Sono chiamata!!\n"); 
    struct maxStruct *sottoVettore = e; 

    printf("Dimensione: %d\n", ((*sottoVettore).dimensione)); 

} 

Видимо эта функция не вызывается каждым потоком, и я не могу понять, почему. Не могли бы вы помочь мне решить эту проблему?

+0

Как вы знаете, что функция не вызывается каждым потоком? Printf не является потокобезопасным; если вы не синхронизируете доступ к нему, вы не получите ожидаемых результатов. – antlersoft

+0

@antlersoft: В Linux '' '' '' '' '' '' 'фактически, поточно-безопасный. –

+0

Что вы делаете после создания потоков? –

ответ

2

Во-первых, незначительный выбор нит, идиоматический способ написать (*sottoVettore).dimensione) - sottoVettore->dimensione.

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

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

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