2012-04-10 10 views
0

Ich habe eine Multitouch-Anwendung. Es hat 3 CCV-Anwendungen, die UDP-Pakete senden. Die erstellte Anwendung empfängt alle diese Pakete über ofxTuio, das Multithread ist. Diese Berührungen kommen dann in den Code, den wir in einem einzigen Thread geschrieben haben. Wir haben Anzeigeobjekte. Sie haben jeweils eine Liste mit Zeigern zu allen Objekten, die sie enthalten. Zum Beispiel haben wir geschrieben, onEnterFrame, addChild, removeChild; Funktionen ähnlich der Anzeigelistensyntax, die Sie mit actionscript sehen würden. Wir erhalten jedoch wegen der multithreading-bedingten tuio-Ereignisse Wiederholungsfehler (Gleichzeitigkeitsprobleme) in der Objektliste. Wie verhindern wir das? Es scheint, als wäre das Sperren (Mutex) nicht richtig, weil auf diese Listen nicht auf mehrere Threads zugegriffen wird. Ich habe eine benutzerdefinierte Warteschlange für diese Liste erstellt, in der sie nie iterieren, während Objekte entfernt oder der Liste mit ein paar Booleschen Werten und einigen zusätzlichen Listen für die Warteschlange hinzugefügt werden. Ich vermute, die Leute sind auf solche Dinge gestoßen, was ist richtige Praxis?C++. Multithreaded Flaschenhals in eine einzelne Gewinde-Anwendung mit Listen

Antwort

2

Flags sind nicht genug, wenn Sie mehrere Threads haben. Verwenden Sie einen Mutex oder einen anderen kritischen Abschnitt, um den Zugriff für Lese- und Schreibvorgänge zu sperren. Dafür sind sie besonders geeignet, wenn Sie asynchrone oder nicht angeforderte Ereignisse haben.

1

Verwenden Sie Mutexe oder atomare compare_and_swap Anweisungen, um Ihre Datenstrukturen threadsicher zu machen.

0

Wenn Sie die std :: list verwenden, werden die Iteratoren nicht ungültig, wenn Sie sie nicht aus der Liste entfernen. In der Tat müssen Sie das Element, das entfernt wird, iterieren, um ein Problem darzustellen. Wenn Sie Ihren Algorithmus so strukturieren können, dass er so auf dem einzelnen Thread behandelt wird, kann dies ausreichen.

Ich bin neugierig, welche Art von Iterator-Fehler Sie bekommen, erhalten Sie inkompatible Fehler? Wie erhalten die Anzeigeobjekte ihre Listen? Über diese Warteschlange? Sobald das Objekt die Liste hat, kann die Liste geändert werden?