2015-06-18 2 views
-1

Завершение задания здесь. Есть код для работы и рассчитать пирог для случайных величин, где я получаю следующие ошибки, за исключением:Pi calculator with mutex Синхронизация

  1. ./piesync 10 3 пи вычислен с 10 точки в 3-х нитей 3,14183961892940200045 * Ошибка в `./ piesync ': свободный(): недействительный следующий размер (быстро): 0x0000000001ca3010 *

  2. ./piesync 100 5 * Ошибка в `./piesync': двойной бесплатно или повреждение (уходит): 0x0000000000ee5040 *

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

Код:

//Pini Vaknine 
#include <stdio.h> 
#include <stdlib.h> 
#include <pthread.h> 

//global variables 
int N, T; 
double gpie = 3.0; 
pthread_mutex_t mutex; 

//pie function 
void* pie_runner(void* arg) 
{ 
    long j = (long)arg;  
    long lower = (N/T)*(j-1)+1; 
    long upper = ((N/T)*(j)); 
    double myPartialSum = 0; 
    //printf("lower=%lu upper=%lu\n",lower , upper); 

    for(long i = lower; i <= upper; i++) 
    {   
     if(i % 2 == 0){ 
      myPartialSum -= 4.0/((2*i)*(2*i+1)*(2*i+2)); 
      //printf("vsum %lu = %f\n", j, vsum[j]); 
        } 
     else{ 
      myPartialSum += 4.0/((2*i)*(2*i+1)*(2*i+2)); 
      //printf("vsum %lu = %f\n", j, vsum[j]); 
        } 


    } 
    pthread_mutex_lock (&mutex); 
    gpie = gpie + myPartialSum; 
    pthread_mutex_unlock (&mutex);  

    pthread_exit(0); 
    //return NULL; 
} 

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

    if(argc != 3) { 
     printf("Error: Must send it 2 parameters, you sent %d\n", argc-1); 
     exit(1); 
    } 
    N = atoi(argv[1]); 
    T = atoi(argv[2]); 


    if(N <= T) { 
     printf("Error: Number of terms must be greater then number of threads.\n"); 
     exit(1);  
    } 



    //launch threads 
    pthread_attr_t attr; 
    pthread_t *tids = (pthread_t *) calloc(T, sizeof(pthread_t)); 
    if(tids == NULL) { 
     fprintf(stderr, "Memory allocation problem\n"); 
     exit(1); 
    } 


     pthread_mutex_init(&mutex, NULL); 
     pthread_attr_init(&attr); 
     pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE); 

    for(long i = 1; i<=T; i++) 
    { 

     int r = pthread_create(&tids[i], &attr, pie_runner, (void*)i); 
     if(r<0) { 
      printf("ERROR: pthread_create() returned %d\n", r); 
      exit(2); 
     } 
    } 

    //wait for threads... 
    for(int k = 1; k<=T; k++) 
    { 
     pthread_join(tids[k], NULL); 
    } 


    printf("pi computed with %d terms in %d threads is %.20f\n", N, T, gpie); 

    pthread_mutex_destroy(&mutex);  
    pthread_attr_destroy(&attr); 

    free(tids); 

    return 0; 
} 
+1

C использует нулевой индексированные циклы и массивы/указатели. – EOF

ответ

1

Вы индексировать вне диапазона массива. Вы выделили массив для T элементов здесь

pthread_t *tids = (pthread_t *) calloc(T, sizeof(pthread_t)); 

но вы индексироваться неправильно, здесь

for(int k = 1; k<=T; k++) 
    { 
     pthread_join(tids[k], NULL); 
    } 

и другие случаи тоже. В C вы индексировать массив из 0 так что цикл должен быть

for(int k=0; k<T; k++) 
+0

Кроме того, у вас есть деление на ноль в –

-1

У вас есть деление на ноль в

if(i % 2 == 0){ 
    myPartialSum -= 4.0/((2*i)*(2*i+1)*(2*i+2)); 

для J = 0.

Закрепление этого

for(long i = lower; i <= upper; i++) 
{   
    if(i % 2 == 0){ 
    if (((2*i)*(2*i+1)*(2*i+2)) == 0) 
     myPartialSum = 0.0; 
    else 
     myPartialSum -= 4.0/((2*i)*(2*i+1)*(2*i+2)); 
    } 
    else{ 
    myPartialSum += 4.0/((2*i)*(2*i+1)*(2*i+2)); 
    } 
} 

и изменение индексов, программа работает из коробки

+0

Когда 'i == 0' в' for (long i = lower; i <= upper; i ++) '? –

+0

Я исправил его уродливо, но теперь я получаю pi, рассчитанный с использованием 55 терминов в 24 потоках, - это 3.14159024700620292947 –

+0

О, извините, это было, когда j = 0 –