Проблема выполнения потока - PullRequest
1 голос
/ 11 июля 2011

Я подхожу к программированию на C с потоками и не могу заставить эту программу работать должным образом. В основном есть вектор с k элементами, n нитями, и каждый поток должен рассчитать максимальное значение для его 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));

}

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

1 Ответ

2 голосов
/ 11 июля 2011

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

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

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

...