2016-12-16 9 views
0

Я хотел бы вычислить математическое суммирование в c с помощью потоков. (Σx^i, От 0 до N). Каждый поток должен вычислять каждый член суммирования и, наконец, в основном программа должна суммировать их все и печатать. Как я могу сделать число потоков динамически? Вот мой код:Как получить динамическое число потоков в C

#include <unistd.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <pthread.h> 
#include <semaphore.h> 
#include <math.h> 

pthread_t sadaf[10]; 
int i,a[10]; 
long int x,N; 
int sum=0; 
pthread_mutex_t mtx; 

void *Myfun(void *tid) 
{ 
    int *ThreadID=(int *)tid; 
    pthread_mutex_lock(&mtx); 
    printf("The thread with id of %d calculated x^i\n",*ThreadID); 
    a[*ThreadID]=pow(x,*ThreadID); 
    sum=sum+a[*ThreadID]; 
    pthread_mutex_unlock(&mtx); 

} 

int main() 
{ 
    int d[10] = {0}; 
    printf("->**************************************************************************<-\n"); 
    printf("This program will calculate the following function:\n-> ∑x^i ,From 0 to N \n"); 
    printf("->**************************************************************************<-\n"); 
    printf("Please enter x:\n"); 
    scanf("%ld",&x); 
    printf("Please enter N:\n"); 
    scanf("%ld",&N); 

    for (i=0; i<N; i++) 
    { 
     d[i] = i; 
     pthread_create(&sadaf[i],NULL,Myfun,(void *)&d[i]); 
    } 
    for (i=0; i<N; i++) 
    { 
     pthread_join(sadaf[i],NULL); 
    } 


    printf("The sum is: %d\n",sum); 

} 
+0

Ваши массивы (* все * из них) имеют пространство для десяти элементов. Если вы вводите 'N', который равен или больше десяти, вы выйдете за пределы и получите * неопределенное поведение *. –

+0

Одна из тех простых вещей, которую нужно запомнить: если у вас размер жесткого кодированного размера, вы, вероятно, ошибаетесь. – Voo

+2

Если вы используете переменную для ваших циклов, которые определены в области файлов, вы определенно попрошайничать. – Gerhardh

ответ

0

d массива может содержать 10 значений, так что если N больше, чем 10, то есть отказ от проблемы ограничений:

int d[10] = {0}; 
    ... 

    for (i=0; i<N; i++) 
    { 
     d[i] = i;  // if i > 10 => you access out of bounds => problem 

У вас есть такая же проблема с другими массивами тоже.

+0

Спасибо за ваш ответ. Как я могу получить динамическое число потоков вместо его определения? Использовать значение for достаточно? –

+0

Я имею в виду, что если пользователь вводит большое количество потоков! система собирается блокировать! что является хорошим ограничением для числа pthreads? –

+1

Проблема здесь не в количестве потоков, а в том, что вы получаете доступ к массивам за пределами. Самое простое здесь - заменить все 'xy [10]' by 'xy [MAX_NB_OF_THREADS]', поместите '#define MAX_NB_OF_THREADS 30' (или что-то еще) и проверьте, вводит ли пользователь число> MAX_NB_OF_THREADS и предпримет соответствующие действия. –

0

Вы только 10 pthreads определены в начале.

pthread_t sadaf[10]; 

Создание более 10 потоков приведет к неопределенному поведению.

+0

Какая смешная ошибка !!!!!! :(Спасибо большое. –

+0

Просто вопрос, Как этого избежать? –