0

ガベージを生成するスレッドに問題がありました。問題を見つけたと思います。誰かが私の疑いを確認または反論し、最善の解決策を推奨できることを願っています。

次に、スレッドディスパッチ関数に

/*global variables*/
struct passArgs
{
    int length;
    char match;
    char** data;
};

スレッドディスパッチ機能で...

struct passArgs args;
pthread_t thrd[ALPHA_LENGTH];
    args.data = data;
    args.length = tt;
    for(int i = 0; i < ALPHA_LENGTH; i++)
    {
        args.match = (char)(i+65);
    pthread_create(&thrd[i], NULL, &processData, &args))
    }

processData()引数が構造体によってローカル変数に渡されるまでに、それらは for ループの次の繰り返しによって上書きされていたため、これは機能しませんでした。

解決策 1: 構造体の配列を作成します。

struct passArgs args[ALPHA_LENGTH];
for(int i = 0; i < ALPHA_LENGTH; i++)
{
    args[i].data = data;
    args[i].length = tt;
    args[i].match = (char)(i+65);
}

関数では、processData()これにより「不完全な型へのポインターを逆参照する」というコンパイルエラーが発生しました。

processData は、次のように構造体からローカル変数を作成します

struct passArgs *myArgs = (struct passArgs *)ptrToArgs;
char** words = (*myArgs).data;
const int length = (*myArgs).length;
const char responsibleFor = (*myArgs).match;

解決策 2: 構造体をグローバル変数セクションに移動します。これは機能しているように見えましたが、グローバル変数は避けるべきであることを知っています。なぜこれが機能したのかもわかりませんか?

4

0 に答える 0