2009-07-19 14 views
0

Ich versuche festzustellen, ob ein Objekt gültig ist. Das Programm hat (mindestens) zwei Threads, und einer der Threads kann das Objekt ungültig machen, indem es aus einem NSMutableArray entfernt wird. Ich brauche den anderen Thread, um entweder seine Existenz oder Gültigkeit zu überprüfen, bevor ich darauf eintrete.Fragen, ob ein Objekt ungültig ist

Antwort

1

Multi-Thread-Programmierung ist schwierig. Hard fängt nicht an zu erfassen, wie schwierig es ist. Dies ist die Art von hart, in der eine allgemeine, brauchbare, "vernünftig qualifizierte" Art und Weise des deterministischen Hinzufügens von zwei verschiedenen Zahlen, die von mehreren Threads in begrenzter Zeit mutiert und geteilt werden, ohne die Verwendung irgendeiner besonderen Unterstützung von der CPU in dem Formular von atomaren Anweisungen wäre ein großer Durchbruch und die These Ihrer Doktorarbeit. Eine Gottheit deiner Wahl würde dir öffentlich für deinen Beitrag zur Menschheit danken. Nur um zwei Zahlen zusammen zu addieren. Tatsächlich ist Multi-Thread-Programmierung sogar noch schwieriger.

Werfen Sie einen Blick auf: Technical Note TN2059 Using collection classes safely with multithreaded applications. Es behandelt dieses Thema im Allgemeinen und umreißt einige der nicht offensichtlichen Fallstricke, die auf Sie warten.

0

Sie sagen

ich den anderen Thread müssen entweder ihre Existenz und ihrer Gültigkeit auf sie, bevor sie handeln überprüfen.

Der einfachste Weg, um den Index des Objekts in der NSMutableArray zu halten, und dann gehen Sie wie folgt

if(myObject == [myArray objectAtIndex: myObjectIndex]) { 

    // everything is good ! 
} 
else { 
    // my object is not what I think it is anymore 
} 

jedoch klar Problem bei diesem Ansatz Es gibt

  1. Insertion, und Löschen wird dich stopfen
  2. Der Ansatz ist nicht threadsicher, da das Array geändert werden kann, während Sie es lesen

Ich empfehle wirklich eine andere Möglichkeit, dieses Array zwischen den beiden Threads zu teilen. Muss es veränderbar sein? Wenn dies nicht der Fall ist, müssen Sie sich nicht mehr um die Threading-Probleme kümmern. Wenn dies der Fall ist, müssen Sie Ihren Ansatz wirklich überdenken. Hoffentlich kann jemand einen Kakao-Weg geben, dies auf threadsichere Weise zu tun, da ich die Erfahrung nicht habe.

+0

Dieser vollständig nicht fadensichere. Zwischen der Suche nach dem Zeiger und der Dereferenzierung könnte es entfernt werden, und es könnte trotzdem in den Array-Aufrufen abstürzen, da NSArray nicht intern threadsicher ist und es während des Lesevorgangs von einem Thread mutieren kann, was zu einem Absturz führen kann. –

+0

Ich stimme deinem Kommentar zu, ich füge ihn meiner Antwort hinzu – hhafez

+0

Ich frage mich, ob es einen Unterschied macht zu fragen, ob es * ungültig * ist und ob es * gültig ist. Vielleicht denke ich zu tief? –

2

Sie können nicht. Die einzige Möglichkeit zu überprüfen, ob der Speicher, den Ihr Objektzeiger noch hat, ein gültiges Objekt darstellt, besteht darin, ihn zu dereferenzieren, aber das Dereferenzieren eines "ungültigen" Objekts (von dem ich annehme, dass Sie einen dealloced bedeuten) führt entweder zum Speicherzugriff ein neues Objekt, das am selben Ort zugewiesen wurde, fehlerhafte Daten, die mit einem normalen Objekt identisch sein können oder nicht, oder eine nicht zugeordnete Speicherseite, die zu einer sofortigen EXEC_BAD_ACCESS führt.

Jedes Mal, wenn Sie einen Verweis auf ein Objekt halten, das Sie möglicherweise in Zukunft verwenden, müssen Sie es beibehalten. Wenn Sie das nicht tun, haben Sie keinerlei Interesse oder Besitz an dem Objekt gezeigt und das System kann es jederzeit wegwerfen.

Die Verwendung von C-Zielobjekten und -Eigenschaften, anstatt die Ivars direkt zu setzen und Retain/Release zu verwenden, vereinfacht das richtige Vorgehen.

+0

Ich habe nicht wirklich die Wahl, es zu behalten. Einer der Threads ist nur ein Beobachter und sollte nicht mit den Objekten interagieren. –

Verwandte Themen