Warum bekomme ich Fehler EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0) wenn ich mit GCD
Konnte jemand, bitte, erklären Sie mir warum bekomme ich Fehler EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0) in dispatch_semaphore_wait in den folgenden code:
-(void) initialize {
dispatch_queue_t queue = dispatch_queue_create("My queue", NULL);
dispatch_semaphore_t sem = dispatch_semaphore_create(1);
self.queue = queue;
self.sem = sem;
self.myarray = [[NSMutableArray alloc]init];
[self.myarray addObject: [[MyObject alloc] init]];
}
-(MyObject *) method1 {
//do something
dispatch_semaphore_wait(self.sem, DISPATCH_TIME_FOREVER);
MyObject *obj = [self.myarray objectAtIndex:0];
dispatch_barrier_sync(self.queue, ^{
[self.myarray removeObjectAtIndex:0];
});
return obj;
}
-(void) method2:(MyObject *)object {
//do something
dispatch_barrier_async(self.queue, ^{
[self.myarray addObject:object];
dispatch_semaphore_signal(self.sem);
});
}
Fand ich ähnliche Frage Warum funktioniert dieser code Ursache "EXC_BAD_INSTRUCTION"?, aber in meinem Fall bin ich mit der ARC und ich Schreibe nicht explizit nirgendwo dispatch_release(sem);
Wie ist die "Warteschlange" definiert? Klar das man in-Initialisierung ist nicht das gleiche.
die gleichen, die ich vergaß zu hinzufügen von code, weist lokalen Variablen zu Instanz-Variablen
Also... äh... haben Sie noch das problem jetzt, dass Sie behoben haben Sie den code? Denn wenn das behoben deinen code, dann sollten Sie die Antwort akzeptieren, nicht Bearbeiten Sie die Frage zu machen, sinnlos.
Ich habe nicht den code ändern, ich bearbeitet habe, nur einige Tippfehler und Ungenauigkeiten nur im text, den ich hier gepostet. Jetzt ist der code hier ist der code, den habe ich im Programm. Die Antwort ist also NEIN, es hat nicht das problem zu beheben.
Sind Sie sicher, dass die Instanz-Methode
die gleichen, die ich vergaß zu hinzufügen von code, weist lokalen Variablen zu Instanz-Variablen
Also... äh... haben Sie noch das problem jetzt, dass Sie behoben haben Sie den code? Denn wenn das behoben deinen code, dann sollten Sie die Antwort akzeptieren, nicht Bearbeiten Sie die Frage zu machen, sinnlos.
Ich habe nicht den code ändern, ich bearbeitet habe, nur einige Tippfehler und Ungenauigkeiten nur im text, den ich hier gepostet. Jetzt ist der code hier ist der code, den habe ich im Programm. Die Antwort ist also NEIN, es hat nicht das problem zu beheben.
Sind Sie sicher, dass die Instanz-Methode
initialize
wurde aufgerufen, bevor Sie senden method1
und Methode method2
? Überprüfen Sie, ob der semaphore und Warteschlangen ivar ist nicht nil ist, bevor Sie es verwenden, z.B. assert(self.sem)
. Auch Ihr code macht, nicht munch Sinn. Ihre Nutzung der semaphore ist auch nicht richtig, dass es nicht zu verhindern, um den Zugriff auf das array selbst, wenn es leer ist, so erhalten Sie eine Ausnahme.InformationsquelleAutor zyxel | 2013-08-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den
sem
Sie in Ihrerinitialize
- Methode ist lokal Gültigkeitsbereich der Methode. Es muss zugänglich sein, um die anderen Methoden. Wenn Sie ein iVar namenssem
dass Sie versucht sind, zu vergeben, du bist shadowing es durch die Deklaration einer lokalen variable ininitialize
. (Das gleiche mitqueue
übrigens.)Auch, Sie scheinen ein Tippfehler hier, dass Sie anrufen
dispatch_semaphore_wait(sen, DISPATCH_TIME_FOREVER);
(d.h. se n vs se m)InformationsquelleAutor ipmcc
Erlaubt den gleichzeitigen Zugriff auf das array
self.myarray
ohne ausreichenden Schutz. Ändern Sie das array mit-addObject:
und-removeObjectAtIndex:
auf die serielle queueself.queue
aber Sie Lesen es mit-objectAtIndex:
ohne jeden Schutz. Das bedeutet, dass Sie kann Lesen zur gleichen Zeit, Sie schreiben, das ist nicht sicher. Sie müssen auch die-objectAtIndex:
- Aufruf auf die serielle queue.Auch, Sie sind mit Barriere-Funktionen mit einer seriellen queue, das macht keinen Sinn.
InformationsquelleAutor Ken Thomases
Diese Art von Absturz passiert, wenn Sie eine (Vektor -) Erweiterung nicht unterstützt wird, auf die CPU.
Beispielsweise in xcode 5 unter "Projekt-Einstellungen /build-Einstellungen /Code-Generierung, legen Sie die
"Damit Weitere Vector extensions" auf "AVX2". Bauen Sie Ihre ausführbare Datei.
Jetzt führen Sie es auf:
tableColumn?.identifier
imtableView:viewForTableColumn:row:
in meiner Tabelle delegieren bekomme ich diesen FehlerDeaktivieren Sie die Vektor-Erweiterungen ( avx2, sse usw ) und sehen, ob an einer Stelle wird es funktionieren.
Sorry, das war eine Weile her. Ich gespeichert
NSTextField
s in ein array und der Zugriff die. Danke für die Hilfe aber 🙂InformationsquelleAutor kalmiya