2009-04-16 130 views
1

我有以下代码,我想知道是否有人可以为我查看它。我担心这段代码没有按照我想要的方式执行,因为使用对象的方式

我有一个多线程应用程序,它们都共享一个对象并对其进行操作。我创建了一个指向它的某个元素的指针,所以我不必每次都输入长路径,但是我担心它可能只是修改共享对象的副本,而不是共享对象本身。

下面是代码:

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

这是有效或会这只是被修改副本?

+0

TLI!你需要告诉我们更多关于你的数据结构的信息......但是我没有看到任何可以复制的东西,所以在获得更多信息之前,暂时的回应是你正在修改正确的对象......但不一定安全线程。 – Varkhan 2009-04-16 17:47:10

回答

2

取决于成员_rpcThread的类型。如果它只是RPCThread []或* RPCThread 那么我认为你没有问题。如果它是一个类的类型,那么你需要 知道它的运算符[]的返回类型。如果相关定义是 返回值而不是引用,则可能有副本。

除非,当然,RPCThread是一个使用信封字母习语或实现虚拟代理的类。

如果_rpcThread只是一个数组,你不应该在这里提出一个别名问题。

这是一件很好的事情来检查,而不要做更多的代码阅读。你可以改变这一点:

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

这样:

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

,而不会引起编译时错误?

+0

是的,我可以做到这一点。 – samoz 2009-04-16 18:08:36

相关问题