0

私の質問は、スレッドへのパラメーターの受け渡しに関するものです。

arrayA など、配列を操作する関数 Foo があります。処理を高速化するために、Foo はアレイ上で双方向に動作するようにコーディングされています。したがって、Foo は arrayA と整数 X をパラメーターとして受け取ります。X の値に応じて、正方向または逆方向に動作します。

「arrayA」と「X」をグローバルに使用しないようにしています。そのため、「arrayA」と「X」をパラメーターとして Foo に渡し、Foo を実行するための 2 つのスレッド (各方向に 1 つずつ) を作成しました。これが私がしたことです:

typedef struct {int* arrayA[MSIZE]; int X; } TP; //arrayPack=TP 

void Foo (void *tP) {

    TP *tp = (TP*)tP;  // cast the parameter tP back to what it is and assign to pointer *tp

    int x;
    printf("\nX: %d", tp->X);
    printf("\n  arrayA: "); for (x=0; x<tp->arrayA.size(); printf("%d ", aP->arrayA[x]), x++);  
} // end Foo

void callingRouting ()  {   
    int* arrayA[MSIZE] = {3,5,7,9}; 
    TP tp; tp.arrayA=arrayA; 
    tp.X=0;   _beginthread(Foo, 0, (void*)&tp); // process -- forward 
    tp.X=1;   _beginthread(Foo, 0, (void*)&tp); // process -- reverse   
} 

値が渡されません。配列が空で印刷され、X の値が正しく印刷されません。私は何が欠けていますか?

また、これに関するいくつかの読み物(スレッドにパラメーターを渡すこと)、特にスレッドによって共有されるリソースを渡すことについての提案もいただければ幸いです。ありがとう。

4

2 に答える 2

2

最初に覚えておくべきことは、他の2つのスレッドを開始しているスレッドがあるということです。プロセッサのタイムスライスとその割り当て方法を制御できないため、他の2つのスレッドがいつ開始されるかがわかりません。また、それらが開始される順序さえもわからない場合があります。

関数が返すとすぐにその関数にローカルなスタック上の配列を使用しているので、callingRouting ()割り当てられたローカル変数は基本的にスコープ外になり、依存できなくなります。

したがって、これを行うにはいくつかの方法があります。

1つは、スレッドに渡されるこれらのデータ項目にグローバルまたは静的メモリ変数を使用することです。

もう1つは、両方のスレッドを開始し、両方が完了するのを待ってから続行することです。

スレッドがいつ開始されるか、またはスレッドの順序がわからないため、実際には、スレッドごとに1つずつ、2つの異なるTP型変数を使用する必要があります。そうしないと、両方のスレッドが同じTPデータを持つようにタイムスライスが割り当てられるリスクがあります。

于 2012-08-28T22:00:55.980 に答える
2

スタック変数のアドレスをスレッド関数に渡していますが、構造体をcallingRouting終了するTPと存在しなくなります。それらはグローバルであるか、ヒープに割り当てられている必要があります。

ただし、変更は両方のスレッドに表示される可能性があるTPため、スレッドごとに 2 つのコピーが必要になります。tp.X=1

そこには問題がありますが、それらがどのように表示されるかは、OS が実行ごとにスレッドをスケジュールする方法によって異なります。

于 2012-08-28T21:55:14.673 に答える