1

私は次のコードを持っています、そして誰かが私のためにそれを見ることができるかどうか疑問に思いました。

私は、すべてがオブジェクトを共有し、それを操作するマルチスレッドアプリケーションを持っています。その特定の要素へのポインタを作成したので、毎回長いパスを入力する必要はありませんが、共有オブジェクトではなく、共有オブジェクトのコピーを変更しているだけかもしれないと心配していますオブジェクト自体。

コードは次のとおりです。

RPCThread* thr = &(args->s->_shared-_>rpcThread[args->threadIndex]);
...
thr->_in_use = true;
...
sema_post(&(thr->_sem_result));

これは有効ですか、それとも単にコピーを変更するだけですか?

4

1 に答える 1

2

メンバー_rpcThreadのタイプによって異なります。単にRPCThread[]または*RPCThreadの場合は、問題はないと思います。クラス型の場合は、operator[]の戻り型を知る必要があります。関連する定義が参照ではなく値を返す場合は、おそらくコピーがあります。

もちろん、RPCThreadがエンベロープ文字イディオムを使用するクラスであるか、仮想プロキシを実装するクラスでない限り。

_rpcThreadが単なる配列である場合、ここで要求している種類のエイリアシングの問題は発生しないはずです。

これは、コードをあまり読み取らずに確認することをお勧めします。これを変更できますか:

 RPCThread* thr = &(args->s->_shared->_rpcThread[args->threadIndex]);

これに:

 RPCThread* thr = args->s->_shared->_rpcThread + args->threadIndex;

コンパイル時エラーを発生させずに?

于 2009-04-16T17:51:11.127 に答える