Я обеспокоен тем, что этот код не делает то, что я хочу, из-за способа использования объектов - PullRequest
1 голос
/ 16 апреля 2009

У меня есть следующий код, и мне было интересно, может ли кто-нибудь взглянуть на него для меня.

У меня есть многопоточное приложение, которое совместно использует объект и работает с ним. Я создал указатель на определенный элемент, просто чтобы мне не приходилось каждый раз вводить длинный путь, но меня беспокоит, что это может быть просто изменение копии общего объекта, а не общего сам объект.

Вот код:

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

Это допустимо или это будет просто изменение копии?

1 Ответ

2 голосов
/ 16 апреля 2009

Зависит от типа члена _rpcThread. Если это просто RPCThread [] или * RPCThread тогда я не думаю, что у тебя есть проблема. Если это тип класса, то вам нужно знать тип возврата его оператора []. Если соответствующее определение возвращая значение, а не ссылку, у вас, вероятно, есть копия.

Если, конечно, RPCThread - это класс, который использует идиому букв-конвертов или реализует виртуальный прокси.

Если _rpcThread - это просто массив, у вас не должно быть проблемы с алиасами, о которой вы спрашиваете.

Вот хорошая вещь, чтобы проверить, не делая намного больше чтения кода. Вы можете изменить это:

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

к этому:

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

без возникновения ошибки времени компиляции?

...