ガベージを生成するスレッドに問題がありました。問題を見つけたと思います。誰かが私の疑いを確認または反論し、最善の解決策を推奨できることを願っています。
次に、スレッドディスパッチ関数に
/*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: 構造体をグローバル変数セクションに移動します。これは機能しているように見えましたが、グローバル変数は避けるべきであることを知っています。なぜこれが機能したのかもわかりませんか?