0

私はこのような構造体を持っています:

struct data{
    int x;
    int y;
}

そして私はこのようなスレッド関数を持っています:

void *threadFunction(void *item){
    data *myData = (data*) item;
    int first = 50;
    int second = 10;
    myData->x = first;
    myData->y = second;
    return(void*) myData;
}

main()で次のようなスレッド関数を呼び出します。

pthread_create(threadID, NULL, threadFunction, &item);

しかし、これを使用してスレッド関数からmain()に値を戻したい場合は、次のようにします。

struct data* returnedItem;
pthread_join(threadID, (void**) returnedItem;
cout << returnedItem->x << returnedItem->y;

私のプログラムは何もしないように見えるので、何が起こるかわかりません。コンパイルして実行しますが、どこかで無限にループするか、何かを待つだけです。何が起こっているのかまったくわかりません。何の反応もありません。私は何が間違っているのですか?pthread_joinステートメントから値を取得するためにmain()に欠けているものはありますか?たぶん私はステートメントの議論を台無しにしましたか?

4

2 に答える 2

1

ポインタが混乱しています。このようにしてください:

void * p;
pthread_join(threadID, &p);
data * returnedItem = static_cast<data *>(p);

ポインタをvoidポインタとの間で変換するXことは可能ですが、型の変数(あなたの場合data *)が実際には型の変数Y(あなたの場合)であると偽ることはできませんvoid *。それは許可されておらず、未定義の動作です。

于 2012-10-20T23:34:08.707 に答える
1

pthread_join2 番目の引数では、スレッドの結果を返すために void* へのポインターを取得するため、 と記述しpthread_join(threadID, (void**) returnedItem );ます。しかし、考えてみてください:

struct data* returnedItem;
// what is the value of returnedItem?? possibly garbage, lets say it is 0xFEDCBA98
pthread_join(threadID, (void**) returnedItem );

そのガーベースを (void**) にキャストすると、ある時点pthread_joinで、スレッドの結果をあなたが提供した引数に書き込みたいので、

* (void**) 0xFEDCBA98 = thread_return_value;

ちょっと待って!無効なポインターを無視するpthread_joinと、セグメンテーション違反のような問題が発生したり、最も重要な情報の 1 つが上書きされたりすることさえあります。したがって、関数が何かを返すための余地が必要になるたびに、有効なメモリを提供する必要があります。有効なコードは次のとおりです。

pthread_join(threadID, (void**) &returnedItem );
于 2012-10-21T01:03:50.993 に答える