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 回答