2013-03-06 55 views
0

K和線程被任意定義如下:傳遞一個二維數組用於線程處理

#define K 1000 
#define THREADS 2 

比方說,我負責做一些東西,有一個叫做二維數組:

long A[K][K]; 

我需要通過這一點,以及一個整數,爲數字的功能的螺紋的實例的,所以使這個結構:

typedef struct tdata { 
    long *(*C)[K]; 
    int nt; 
} tdata; 

我然後按照標準程序啓動POSIX線程並執行以下操作:

void threader(long A[K][K]) {  
    pthread_t p[THREADS]; 
    tdata d[THREADS]; 
    int i; 

    for(i=0;i<THREADS;++i) { 
     d[i].nt = i; 
     d[i].C = &A; 
     pthread_create(&p[i],NULL,func,&d[i]); 
     pthread_join(p[i],NULL); 
    } 
} 

然後在我的功能,我嘗試按如下方式訪問上述的陣列:

void *func(void *arg) { 
    tdata *data=arg; 
    int a, b; 
    ... 
    for(a=0; a<K; ++a) 
     for(b=0; b<K; ++b) 
     long access = (*(data->C))[a][b]; 
    ... 
    return 0; 
} 

會發生什麼事是我最終在程序段出錯並死亡之前檢索一些不可思議的數字。我的懷疑是,我正在做一些非常錯誤的事情,把我的數組傳遞給func。任何人都可以給我一個線索,我應該用A [K] [K]做什麼?

+0

'tdata'中沒有'G'。請向我們展示您的*實際*代碼。 – NPE 2013-03-06 07:49:10

+0

'A'是一個本地(自動)變量嗎?如果是這樣,它的封閉函數返回後超出範圍... – 2013-03-06 07:49:54

+0

'長*(* A)[K];'應該'長(* A)[K];'你應該訪問'data-> A [A] [b]'。 – cnicutar 2013-03-06 07:51:38

回答

1

正如cnicutar在上面評論中提到的那樣,long *(*C)[K];確實應該是long (*C)[K];並且使用data->C[a][b]而不是(*(data->C))[a][b]來訪問。

此外,我還必須將d[i].C = &A;更改爲d[i].C = A;,threader,我這樣做,現在程序正常工作。