0

私はC++プログラミングとスレッドの実装に不慣れです。私の目標は、2つのスレッドを使用して1つの配列の2つのサブ範囲(要素0〜9と要素10〜19)に要素を追加し、スレッドから返された値を追加して、アレイ。私は次のコードをコンパイルしましたが、「gdb」デバッガーに関する限られた知識に基づいて、私の問題はsum_functionのポインターにあるようです。私は自分の間違いを理解できません。どんな助けでも大歓迎です!!!

#include <iostream>
#include <pthread.h>

using namespace std;

int arguments[20]; 

void *sum_function (void *ptr);

int main (void) {

pthread_t thread1, thread2;
int total, sum1, sum2 = 0;
int lim1 = 10;
int lim2 = 20;
for (int i = 0; i < 20; i++)
    cin >> arguments[i];

sum1 = pthread_create ( &thread1, NULL, sum_function, (void*) lim1);
sum2 = pthread_create ( &thread2, NULL, sum_function, (void*) lim2);

pthread_join (thread1, NULL);
pthread_join (thread2, NULL);

total = sum1 + sum2;

cout << "OUTPUT \n" << total << "\n";

return (0);
}

void *sum_function (void *lim) {

int sum = 0;
for (int j = 0; j < (*(int*)lim); j++)
    sum += arguments[j];
return (void*) sum;

}
4

2 に答える 2

2
sum1 = pthread_create ( &thread1, NULL, sum_function, (void*) lim1);
sum2 = pthread_create ( &thread2, NULL, sum_function, (void*) lim2);

これは渡さ10れ、スレッド20にキャストされます。void *

for (int j = 0; j < (*(int*)lim); j++)

これにより、とがにキャスト1020れ、int *それらが逆参照されます。しかし、それらは有効なポインターではありません。

スレッドにアドレスを受信させたい場合は、スレッドにアドレスを渡す必要があります。スレッドに値を渡したい場合は、値を受け取るようにコーディングします。

これは2つの方法で修正できます。

1)一貫してポインタを渡し、期待します。

sum1 = pthread_create ( &thread1, NULL, sum_function, (void*) &lim1);
sum2 = pthread_create ( &thread2, NULL, sum_function, (void*) &lim2);
...
for (int j = 0; j < (*(int*)lim); j++)

pthread_createがスレッドにポインタを渡し、スレッドがそのポインタを逆参照していることに注意してください。

2)一貫して値を渡し、期待します。

sum1 = pthread_create ( &thread1, NULL, sum_function, (void*) lim1);
sum2 = pthread_create ( &thread2, NULL, sum_function, (void*) lim2);
...
for (int j = 0; j < ((int)lim); j++)

が整数値を渡していることに注意してくださいpthread_create。スレッドは整数値を期待しています。

于 2012-06-01T05:13:03.857 に答える
0

これはタイトルとは直接関係ありません。私はあなたの現在の状況に取り組んでいます。構造体を作成できます。

struct args
{
    int arr_limit;
    int local_result;
};

void次に、必要に応じてこの構造体にデータを入力し、関数へのポインタとしてアドレスを渡しpthread_createます。あなたは両方の問題を解決することができます..これが役立つことを願っています...

于 2012-06-01T05:54:16.707 に答える