2009-04-16 2 views
1

Ich habe den folgenden Code und ich fragte mich, ob jemand könnte es für mich betrachten.Ich bin besorgt, dass dieser Code nicht tut, was ich will, weil die Objekte verwendet werden

Ich habe eine Multi-Thread-Anwendung, die alle ein Objekt teilen und darauf arbeiten. Ich habe einen Zeiger auf ein bestimmtes Element erstellt, so dass ich nicht jedes Mal den langen Pfad eingeben muss, aber ich befürchte, dass es möglicherweise eine Kopie des gemeinsamen Objekts statt des freigegebenen Objekts ändert Objekt selbst. Hier

ist der Code:

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

Ist dies gültig oder würde dies nur eine Kopie zu modifizieren werden?

+0

TLI! Sie müssen uns mehr über Ihre Datenstrukturen erzählen ... Aber ich sehe nichts, was eine Kopie hier machen würde. Bis ich weitere Informationen bekomme, wäre eine vorläufige Reaktion, dass Sie das richtige Objekt modifizieren ... aber nicht unbedingt sicher fädeln. – Varkhan

Antwort

2

Hängt vom Typ des Elements _rpcThread ab. Wenn es einfach RPCThread [] oder * RPCThread ist, dann glaube ich nicht, dass Sie ein Problem haben. Wenn es sich um eine Klassenart handelt, benötigen Sie , um den Rückgabetyp des Operators [] zu kennen. Wenn die relevante Definition ist, die einen Wert anstelle einer Referenz zurückgibt, haben Sie wahrscheinlich eine Kopie.

Es sei denn natürlich, RPCThread ist eine Klasse, die das Umschlag-Buchstabe-Idiom verwendet oder einen virtuellen Proxy implementiert.

Wenn _rpcThread nur ein Array ist, sollten Sie hier kein Aliasing-Problem der Art haben, nach der Sie fragen.

Hier ist eine gute Sache zu überprüfen, ohne viel mehr Code zu lesen.

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

dazu: Können Sie dies ändern

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

ohne einen Fehler bei der Kompilierung verursacht?

+0

Ja, ich kann das tun. – samoz

+0

das verheißt gut ... es ist immer möglich, dass es einige seltsame Conversion-Operator-Überladungen gibt, aber ich denke, dass andere Threads denken, dass sie die gleiche Adresse haben (protokolliere die Adresse von verschiedenen Threads als Hexadezimalwert, überprüfe nach) Identität) –

Verwandte Themen