2015-02-07 125 views
0

對於這個程序,我通過命令行傳遞數字,然後有一個多線程程序,它接受每個參數,計算它的因子,然後打印它們。我知道C++,但是我對c很粗糙,並且似乎無法正確地爲該程序正確地轉換。特別是當我將參數傳遞給thread_create並將其轉換爲整數時。我有下面的代碼編譯,但轉換後的值始終是0.如何將char值轉換爲void *然後轉換爲整數?如何從argv傳遞一個整數到pthread_create函數中? (C)

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

    #define MAX_ARRAY (17) 

    void *thread_func(void *); 

    int factors[MAX_ARRAY]; 

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

      pthread_t thread_handle[argc]; 
      int i; 
      int g; 

      // Create Children Threads 
      for (i = 0; i < argc; i++) { 
        pthread_create(&thread_handle[i], NULL, thread_func, &argv[i + 1]); 
      } 

      // Rejoin Threads 
      for (i = 0; i < argc; i++) { 
        pthread_join(thread_handle[i], NULL); 

        // Print Factors Here 
        printf("%d: ", atoi(argv[i])); 
        for (g = 0; g < MAX_ARRAY; g++) { 
          printf("%d, ", factors[g]); 
        } 

        printf("\n"); 

        for (g = 0; g < MAX_ARRAY; g++) { 
          factors[g] = 0; 
        } 
      } 
      return 0; 
    } 

    void *thread_func(void *data) { 
      int n = atoi(data); 
      int x; 
      int v; 

      printf("Number to factor is: %d\n", n); 

      for (x = 1; x <= n; ++x) { 
        if (n%x == 0) 
          factors[v++] = x; 
      } 
      return NULL; 
    } 
+0

我沒有看到你的代碼或任何理由認爲你需要他們的任何轉換。 – 2015-02-07 03:19:02

+0

在thread_func中,我必須解引用傳入的值,並且該值是一個空指針。我必須將它從void *轉換爲整數*或我可以解引用的東西。 – JamaicanBambi 2015-02-07 03:22:10

+1

@ user3208991:不,指針指向命令行中的字符串。你只需要將它傳遞給'atoi'(就像你正在做的那樣)來將字符串解釋爲十進制數。 – 2015-02-07 03:29:20

回答

1

問題是,每個線程使用相同的數組作爲因素,沒有任何同步。但是如果每個線程在運行之前必須獲得數組的鎖定,那麼它們實際上將全部按順序運行,這將破壞線程化的目的。

順便提一句,argv [0]是程序名,您應該跳過。

你應該做的是爲每個線程有一個不同的因子數組,以便它們可以獨立工作而不受干擾。您還應該在主線程中進行所有顯示,以控制打印的順序。

由於可能最好按順序顯示因子,因此首先應創建所有線程,然後加入所有線程,最後顯示結果。

這裏和那裏還有一些小錯誤,如一個錯誤或未初始化的變量。

這裏是一個修正版本:

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

#define MAX_ARRAY 17 

typedef struct { 
    int factors[MAX_ARRAY]; 
    int n; 
} thread_data; 

void * thread_func (void *); 

int main (int argc, char *argv[]) { 
    int n = argc - 1; 
    pthread_t thread_handle[n]; 
    thread_data thread_data_table[n]; 
    int i; 

    // Create Children Threads 
    for (i = 0; i < n; i++) { 
     thread_data_table[i].n = atoi (argv[i + 1]); 
     pthread_create(&thread_handle[i], NULL, thread_func, 
         &thread_data_table[i]); 
    } 

    // Join Threads 
    for (i = 0; i < n; i++) { 
     pthread_join(thread_handle[i], NULL); 
    } 

    // Print Factors 
    for (i = 0; i < n; i++) { 
     int j; 

     printf("%d: ", thread_data_table[i].n); 
     for (j = 0; j < MAX_ARRAY; j++) { 
      int x = thread_data_table[i].factors[j]; 
      if (x == 0) { 
       break; 
      } 
      printf("%d, ", x); 
     } 
     printf("\n");   
    } 
    return 0; 
} 

void * thread_func (void *data) 
{ 
    thread_data *p = (thread_data*)data; 
    int i; 
    int count = 0; 

    for (i = 1; i <= p->n; ++i) { 
     if (p->n % i == 0) { 
      if (count == MAX_ARRAY) { 
       break; 
      } 
      p->factors[count++] = i; 
     } 
    } 
    if (count < MAX_ARRAY) { 
     p->factors[count] = 0; 
    } 

    return NULL; 
} 
+0

謝謝!我爲我的雜亂代碼道歉。我誤解了這些線程實際上是如何相互運行的。是否可以通過在每個線程上分配一個數組來實現相同的結果(連接後將其釋放)? – JamaicanBambi 2015-02-07 04:21:26

相關問題