2013-11-22 37 views
0

一直在执行此分配并使用pthread来模拟multithreading中的C语言。代码使用替代方法找到最大值。它编译得很好,也可以运行,但在中途崩溃。我正在使用windows 7 64 bit。我认为这很重要。Pthread代码在运行时中途崩溃

#include <stdio.h> 
#include <stdlib.h> 
#include <pthread.h> 

long n,thread_count; 
long* w_array; 
long* x_array; 

void* Initiate(void* index);//initializes control array W 
void* Compare(void* pair);//compares each possible pair of input array x. not finished! 

struct Pairs { 
    long i,j; 
}; 

int main(int argc, char **argv) { 
    pthread_t* thread_handles; 
    long thread; 
    n = strtol(argv[1],NULL, 10); 
    thread_handles = malloc(n*sizeof(pthread_t)); 

    w_array = malloc(n*sizeof(long)); 
    x_array = malloc(n*sizeof(long)); 
/*argv[1] is number of inputs,then comes the array*/ 

    printf("Number of input values \t %ld \n", n); 
    printf("Input values \t\t X = "); 

    for(thread = 0; (thread<n);thread++){ 
     x_array[thread] = strtol(argv[thread+2], NULL, 10); 
     printf(" %ld ", strtol(argv[thread+2], NULL, 10)); 
    } 
    printf("\nAfter Initialization \t W = "); 
    for (thread = 0;(thread < n);thread++){ 
     pthread_create(&thread_handles[thread], NULL, Initiate, (void*)thread); 
    } 

    for(thread = 0; (thread < n);thread++){ 
     pthread_join(thread_handles[thread],NULL); 
    } 

    free(thread_handles); 

    /* Problem comes after this section */ 
    long thread_cmp_count = n*(n-1)/2; 
    long t; 
    struct Pairs *pair; 
    thread_handles = malloc(thread_cmp_count*sizeof(pthread_t)); 
    thread_cmp_count -= 1; 
    for(thread = 0;(thread < n); thread++){ 
     for(t = thread+1; t < n; t++){ 
      pair->i = thread; 
      pair->j = t; 
      pthread_create(&thread_handles[thread_cmp_count--], NULL, Compare, (void*) pair); 
     } 
    } 

    for(thread= 0;(thread<thread_cmp_count); thread++){ 
     pthread_join(thread_handles[thread], NULL); 
    } 

    free(thread_handles); 


    return 0; 

} 

下面是原型

void* Initiate(void* index){ 
     long my_index = (long)index; 
     w_array[my_index] = 1; 
     printf(" %ld ", w_array[my_index]); 
     return NULL; 
    } 

    void* Compare(void* pair){ 

     struct Pairs *my_pair = (struct Pairs*)pair; 
     long int i_index = (long int) my_pair->i; 
     long int j_index = (long int) my_pair->j; 
     printf("\nThread %ld, %ld", i_index, j_index); 
     return NULL; 
    } 


Here is snapshot of the output 

    C:\Users\Jos\Desktop\c compile>gcc -g -o max max.c -lpthread 
    max.c: In function 'main': 
    max.c:49:59: warning: cast to pointer from integer of different size [-Wint-to-p 
    ointer-cast] 
     pthread_create(&thread_handles[thread], NULL, Initiate, (void*)thread); 
                  ^
    max.c: In function 'Initiate': 
    max.c:84:18: warning: cast from pointer to integer of different size [-Wpointer- 
    to-int-cast] 
     long my_index = (long)index; 

       ^

C:\Users\Jos\Desktop\c compile>max 4 1 2 3 4 
Number of input values 4 
Input values    X = 1 2 3 4 
After Initialization  W = 1 1 1 1 
+2

您的调试器不工作吗? – James

回答

2

您需要在下面的代码段用于分配也struct Pairs *pair;实现。

struct Pairs *pair; 
    thread_handles = malloc(thread_cmp_count*sizeof(pthread_t)); 
    thread_cmp_count -= 1; 
    for(thread = 0;(thread < n); thread++){ 
     for(t = thread+1; t < n; t++){ 
      pair->i = thread; 
      pair->j = t; 
      pthread_create(&thread_handles[thread_cmp_count--], NULL, Compare, (void*) pair); 
     } 
    } 

与您的代码,它去指未初始化的指针,因此你越来越崩溃。

+0

感谢他正在工作 – Jos

2

难道是在最低的部分,你不分配内存struct Pairs *pair;

+0

是的,这是问题所在。现在修好 – Jos