我担心由于使用对象的方式,这段代码没有做我想做的事情

Posted

技术标签:

【中文标题】我担心由于使用对象的方式,这段代码没有做我想做的事情【英文标题】:I'm concerned this code isn't doing what I want it to because of the way objects are used 【发布时间】:2009-04-16 17:36:56 【问题描述】:

我有以下代码,我想知道是否有人可以帮我看一下。

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

代码如下:

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

这是有效的还是只是在修改副本?

【问题讨论】:

TLI!您需要告诉我们更多关于您的数据结构的信息......但我没有看到任何可以在这里复制的东西,所以在我得到更多信息之前,一个初步的回应是你正在修改正确的对象......但不一定安全线程。 【参考方案1】:

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

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

如果 _rpcThread 只是一个数组,那么您不应该在此处遇到您所询问的那种别名问题。

在不阅读更多代码的情况下进行检查是一件好事。你能改变这个吗:

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

到这里:

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

不会导致编译时错误?

【讨论】:

好兆头...总是可能有一些奇怪的转换运算符重载,但我想另一件要检查的事情是不同的线程认为它们具有相同的地址(记录来自不同线程的地址作为十六进制值,检查身份)

以上是关于我担心由于使用对象的方式,这段代码没有做我想做的事情的主要内容,如果未能解决你的问题,请参考以下文章

为啥要按两下才能做我想做的事?反应原生

Javascript/jQuery onbeforeunload HTML 事件麻烦

在iphone中设置UIToolBar的背景图片

我可以在 STL 容器中使用 MFC 对象吗?

无法更改 InnerText 0r InnerHTML

Git stash 部分暂存文件