代わりstruct
を使用しての、1も正しいタイプでローカル変数を作成することができます。
#define ROWS 3
#define COLS 3
/* Sum the values in a 3x3 array. */
/* This would be your thread entry point. */
void sum(void *args) {
int (*array)[ROWS][COLS] = args; // Declare and initialize a pointer to a ROWSxCOLS array of ints.
int row;
int col;
int total = 0;
for(row = 0; row < ROWS; row++) {
for (col = 0; col < COLS; col++) {
total += (*array)[row][col]; // Access [row][col] from the array pointed to by "array".
}
}
(void) total;
}
int main(int argc, char** argv) {
int arrayIn[ROWS][COLS] = {
{0, 1, 2},
{3, 4, 5},
{6, 7, 8}
};
sum(arrayIn);
}
@イアン・アボットによって提案struct
ソリューションは簡単にできるという利点を持っていますより複雑なデータをスレッドに渡す(配列の次元など)。
問題を再現する最小限の例を示します。 – 2501
関数にパラメータとして渡されると、配列は最初の要素へのポインタに減衰します。したがって、スレッドの 'args'パラメータとして配列を渡す場合、スレッド関数はそれを要素型へのポインタ変数に割り当てる必要があります。配列を直接渡すのではなく、 'struct'型のメンバを使ってそれを指し、スレッドの' args'として 'struct'へのポインタを渡すことができます。スレッド関数はそれを適切な 'struct'ポインタ型にキャストできます。 –
'pthreads 'を使っているなら、これは素晴らしいチュートリアルです。あなたがいなくても、概念は同じです:https://computing.llnl.gov/tutorials/pthreads/ – yano