2009-04-16 4 views
1

나는 다음 코드를 가지고 있으며 누군가 나를 위해 그것을 볼 수 있는지 궁금해하고 있었다.나는이 코드가 객체가 사용되는 방식 때문에 내가 원하는 것을하지 않는다고 염려한다.

나는 모두 개체를 공유하고 작업하는 멀티 스레드 응용 프로그램이 있습니다. 나는 특정 요소에 대한 포인터를 만들었으므로 매번 긴 경로를 입력 할 필요가 없지만 단순히 공유 객체가 아닌 공유 객체의 사본을 수정하는 것이 염려 스럽습니다. 개체 자체.

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

이 유효하거나 그냥 사본을 수정하는 것입니다 : 여기

코드인가?

+0

TLI! 데이터 구조에 대해 더 알려줄 필요가 있습니다. 그러나 여기에 사본을 만들 수있는 내용은 보이지 않습니다. 자세한 정보를 얻을 때까지 잠정적 인 응답은 올바른 개체를 수정하는 것입니다.하지만 반드시 그런 것은 아닙니다. 실을 안전하게 감싸십시오. – Varkhan

답변

2

_rpcThread 멤버 유형에 따라 다릅니다. RPCThread [] 또는 * RPCThread 인 경우 문제가 있다고 생각하지 않습니다. 클래스 유형 인 경우 연산자 []의 반환 유형을 알기 위해서는 이 필요합니다. 관련 정의가 인 경우 참조가 아닌 값을 반환하는 경우 사본이있을 수 있습니다.

물론 RPCThread가 봉투 문자 관용구를 사용하거나 가상 프록시를 구현하는 경우가 아니면.

_rpcThread가 배열 인 경우 여기에서 요청하는 종류의 별칭 문제가 있어서는 안됩니다.

더 많은 코드를 읽지 않고 확인하는 것이 좋습니다. 컴파일 타임 오류를 발생시키지 않고

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

이에

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

: 당신은이를 변경할 수 있습니까?

+0

예 할 수 있습니다. – samoz

+0

그게 잘 ... 그것은 항상 이상한 변환 연산자 오버로드가있을 수도 있지만 다른 것들을 확인하는 다른 스레드가 그들이 같은 주소 (16 진수 값으로 다른 스레드에서 주소를 로그, 생각에 대한 것입니다 정체) –