2

pthreadを使用して2つの行列を乗算しようとしています。マトリックス内の要素ごとに、個別のpthreadが作成されます。私のプログラムではそれを行いますが、2つの行列の要素の総数のサイズとして動的に宣言されたpthread_tの配列を使用します。

私が抱えている問題は、スレッドをうまく作成することですが、ランナー関数のテストとして、一度も実行されないように見えるcoutステートメントがあります。簡潔にするために、ファイルから2つの行列を読み取り、それらを2つの配列に格納するコードの部分を削除しました。また、2つのマトリックスの要素数をカウントし、それを使用してpthread配列のサイズを設定しました。私はそのコードを個別にテストしたので、それが私の問題とは何の関係もないと確信しています。

これが私の問題に関連するコードです:

int main(int argc, char **argv)
{
pthread_attr_t attr;
pthread_t *workers;
workers = new pthread_t[numThreads];
int counter = 0;
for(int count1 = 0; count1 < (rows2 * cols2); count1++)
{
    infile2 >> array2[count1];
}
for(int i = 0; i < rows1; i++)
{
    for(int j = 0; j < cols1; j++)
    {
        location *data = new location;
        data->row = i;
        data->col = j;
        pthread_create(&(workers[counter]), &attr, runner, data);
        counter++;
    }
}
for(int i = 0; i < rows2; i++)
{
    for(int j = 0; j < cols2; j++)
    {
        location *data = new location;
        data->row = i;
        data->col = j;
        pthread_create(&(workers[counter]), &attr, runner, data);
        counter++;
    }
}
for(int add = 0; add < 24; add++)
{
    pthread_join(workers[add], NULL);
}
return 0;
}

と私のランナー機能:

void *runner(void *param)
{
    cout << "bob" << endl;
    pthread_exit(NULL);
}
4

1 に答える 1

3

pthread_attr実際のコードのどこかで初期化しますか? 使用しない場合pthread_attr_init()、または使用しない場合は NULL として渡します。pthread_create「無効な引数」で失敗しているようです。また、実際のコードでまだ行っていない場合は、すべてのリターン コードを確認してください。Pthread 引数は、成功すると 0 を返し、失敗すると正の整数を返します。

于 2012-10-05T04:39:27.957 に答える