2016-07-18 9 views
1

Ich unterhalte einige Software, die auf Windows und mehreren UNIX-Plattformen läuft: Mac, Linux, AIX und Solaris. Es implementiert eine Threading-Infrastruktur auf Pthreads oder Win32-Threads. Ich fange an, in dieser Infrastruktur rwlocks zu implementieren, damit unsere Entwickler sie nutzen können. So weit, ist es gut.Q: Mac OS X pthreads und GCD, auf der Suche nach Rwlock gleichwertig in GCD

Unter Mac OS X haben wir ursprünglich das Threading mit normalen Pthreads implementiert, aber festgestellt, dass die Leistung sehr schlecht war, weil OS MTP-Threads immer Systemaufrufe machten. Apple empfahl, dass wir GCD-Versand-Semaphore verwenden, und dies funktionierte gut, mit einer beträchtlichen Leistungsverbesserung, da das Warten auf ein Semaphor eine einfache Userspace-Operation ist, wenn das Semaphor frei ist.

Allerdings kann ich keine Möglichkeit sehen, das Äquivalent von Rwlocks zu tun, und es sieht unmöglich in Bezug auf eine einfache Semaphor. Fehle ich etwas oder ist das eigentlich unmöglich?

Hinweis: Es ist nicht möglich, alles auf den GCD-Ansatz mit Warteschlangen und Blöcken umzustellen. Der Code muss auf Plattformen funktionieren, die nicht über GCD verfügen, und das Neuschreiben aller Verwendungen der Threading-Infrastruktur in etwa 170 Quelldateien wäre nicht praktikabel.

+0

Der übliche Ansatz zum Implementieren von Lese-/Schreibsperren in GCD wird [in dieser Antwort] (http://stackoverflow.com/a/10234838/1218876) (und den zugehörigen Links) beschrieben. Gibt es einen Grund, warum Sie diese Methode nicht verwenden können? Warum brauchst du genau einen Semaphor und sonst nichts? –

+0

Ich kann glücklich mehrere Semaphore verwenden, wenn ich einen Weg finde, um es zu tun, aber soweit ich sehen kann, kann ich dispatch_barrier_async() nicht verwenden, weil ich Apples Blockkonstrukt nicht verwenden kann. Ich arbeite in einer domänenspezifischen Sprache, die zu C kompiliert, und weiß nichts über Apples Blöcke. Der * einzige * Teil von GCD, den ich benutze, ist die Semaphore: alles andere ist Pthreads. –

+0

Sie müssen nicht unbedingt Blöcke verwenden. GCD hat funktionsbasierte Versionen aller seiner Primitiven. Zum Beispiel gibt es [dispatch_barrier_async_f] (https://developer.apple.com/reference/dispatch/1452812-dispatch_barrier_async_f). –

Antwort

0

Silly mich, sollte zuerst Wikipedia überprüft haben. Es gibt several ways, um es dort zu tun. Es ist ein Standard-Informatik-Problem: nicht ganz trivial, aber gut verstanden.