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
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.
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
- Insertion, und Löschen wird dich stopfen
- 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.
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.
Ich habe nicht wirklich die Wahl, es zu behalten. Einer der Threads ist nur ein Beobachter und sollte nicht mit den Objekten interagieren. –
- 1. Überprüfen, ob ein Stripe-Coupon ungültig ist
- 2. Prüfen, ob ein Objekt ist
- 3. Wie überprüfe ich Swift, wenn ein Objekt ungültig ist?
- 4. Wie finde ich heraus, ob ein Steuerelement gerade ungültig ist?
- 5. Testet, ob ein Objekt eine Enum ist
- 6. Python: Bestimmen, ob ein Objekt dateiähnlich ist?
- 7. Testen, ob das Objekt ein Vektor ist
- 8. prüfen, ob ein Objekt ist Array-artige
- 9. Realm-Objekt Prädikat Suche ist ungültig
- 10. Mungo: prüfen, ob das Objekt ein Mungo-Objekt ist
- 11. Testen Sie, ob eine Variable eher ein primitives Objekt als ein Objekt ist?
- 12. Testen, ob ein Objekt ein Dictionary in C ist
- 13. Wie testen, ob ein Objekt ein Proxy ist?
- 14. Prüft, ob ein Objekt ist nicht Null ist, bevor Rückkehr
- 15. WPF-Bindung - So ermitteln Sie, ob das Objekt ungültig ist, um zu speichern
- 16. Core Data-Objekt wird ungültig
- 17. NSArray, letztes Objekt immer ungültig
- 18. Ist ein Datentyp in C ungültig?
- 19. Angular2: Kann benutzerdefinierte Eingabe wissen, ob es ungültig ist?
- 20. Wie kann ich feststellen, ob eine zusammengesetzte Formatzeichenfolge ungültig ist?
- 21. Wie überprüft man, ob eine Sitzung ungültig ist
- 22. Wie überprüft man, ob ein Sprite-Objekt sichtbar ist?
- 23. Wie finde ich heraus, ob ein Objekt gesperrt ist? C#
- 24. Wie überprüft man, ob ein Objekt in Ruby iterierbar ist?
- 25. Testen, ob ein Objekt in ActionScript definiert ist
- 26. Ermitteln, ob eine Variable ein Datetime-Objekt ist
- 27. Wie testen, ob eine Variable ein Moment.js-Objekt ist?
- 28. Wie überprüft man, ob ein Objekt serialisierbar ist in C#
- 29. Wie testen, ob ein Objekt eine Java AWT-Komponente ist?
- 30. Wie überprüft man, ob ein Objekt kein Array ist?
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. –
Ich stimme deinem Kommentar zu, ich füge ihn meiner Antwort hinzu – hhafez
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? –