2013-10-02 4 views
2

В настоящее время я работаю над программой, которая использует потоки для вычисления суммы квадратных корней. Моя программа работает, однако одно из требований состоит в том, чтобы использовать основной поток, чтобы найти начальное значение, и как только я вызываю функцию Void * calc из main, программа прерывается. Есть ли способ сделать такой вызов функции? Это потому, что функция является указателем? Любая помощь приветствуется.Вызов функции void * from main in C

#include <pthread.h> 
#include <stdio.h> 
#include <math.h> 
#include <unistd.h> 
#define NUM_THREADS 3 
int ARGV; 
pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER; 
double total = 0; 


void *calc(void* t){ 
    int ph = (int)t + 1; 
    int start, stop, interval_size; 
    interval_size = ARGV/(NUM_THREADS + 1); 
    start = ((ph) * interval_size) + 1; 
    stop = (ph * interval_size) + 1; 
    double ttl; 
    int i; 

    for (i = start; i <= stop; i++){ 
      ttl = ttl + sqrt(i); 
      printf("Total Thread %i %lf\n", ph, ttl); 
     } 


    pthread_mutex_lock(&m); 
    total = total + ttl; 
    pthread_mutex_unlock(&m); 

    pthread_exit(NULL); 
} 

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

    int i; 
    double ttl; 
    ARGV = atoi(argv[1]); 

    pthread_t ti[NUM_THREADS]; 

    calc(0); 
    for (i = 0; i < NUM_THREADS; i++) { 
     pthread_create(&ti[i], NULL, calc,(void *)i); 
    } 
    /*for (i = 1; i <= (ARGV/4) ; i++){ 
      ttl = ttl + sqrt(i);  
    }*/ 
    for (i = 0; i < NUM_THREADS; i++) { 
     pthread_join(ti[i], NULL); 
    } 

    total = total + ttl; 

    printf("Result: %lf\n", total); 
} 

Программа прерывается, поскольку функция, как представляется, вызывается только один раз, вместо каждого потока, используя функцию. Единственное напечатанное значение - это некоторое неопределенное неправильное число.

+2

Что вы подразумеваете под словом «программа перерывов?» – templatetypedef

+0

Calc вызывается непосредственно перед циклом for, создающим потоки. – Ranma344

+0

Мне не нравится '(void *) i' очень, когда' i' является 'int'. В этом случае он, скорее всего, будет работать так, как предполагалось, но я считаю, что это определение реализации. –

ответ

8

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

Чтобы разрешить другие потоки, чтобы продолжить выполнение, основной поток должен оканчиваться по телефону pthread_exit(), а не выход (3).

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

+0

есть 'pthread_exit()' in 'main()'? – WhozCraig

+0

@WhozCraig Существует прямой 'calc (0)'. – cnicutar

+0

Ahh .. хорошо ады-колокольчики. Хорошо поймал. (+1) – WhozCraig