2015-05-18 8 views
6

Ich frage das aus Neugier.Mac OS entspricht der Windows Fibers API?

Windows bietet eine so genannte Fibers API, eine API für einfache Benutzerprozesse/Threads.

Ich war interessiert zu wissen, ob Mac OS auch solche Funktionen bietet. Soweit ich herausfinden konnte, wäre die nächste Unix-Entsprechung die setcontext Familie von Funktionen. Wenn Sie jedoch versuchen, eine solche API in einem Mac-Programm aufzurufen, werden Warnungen angezeigt, dass die Funktionen seit OS X 10.6 veraltet sind. Wenn ich versuche, das oben im Wikipedia-Link bereitgestellte Beispiel zu kompilieren und auszuführen, erhalte ich einen Seg-Fehler auf meiner Maschine unter der ersten swapcontext.

Also anscheinend ist die setcontext API ein Nein für Mac. Nicht mehr mindestens. Gibt es eine andere Möglichkeit, leichte benutzerfreundliche Threads unter Mac OS zu erreichen? Bietet das System eine solche Funktionalität?

+1

Haben Sie sich Grand Central Dispatch angesehen? –

+0

@ScottHunter, ich kenne einige der GCD-Framework. Aber erlaubt es beispielsweise, manuell zwischen Arbeitsfäden zu wechseln, wie es bei den Fasern der Fall ist? Ich glaube nicht, dass GCD als gleichbedeutend mit User-Side-Threads angesehen werden könnte ... – glampert

+0

Ich würde nicht unbedingt auf dem Mac OS setcontext() ganz so schnell aufgeben ... veraltete Funktionen funktionieren in der Regel immer noch; Es wird nicht garantiert, dass sie in zukünftigen OS-Versionen unterstützt werden. Es kann also nur darum gehen, einige Details zu optimieren, um setcontext() unter MacOS zu verwenden. –

Antwort

2

Nein, auf OS X (oder den meisten UNIX-basierten Systemen) gibt es kein Äquivalent. Die Funktionsreihe ucontext wurde vom POSIX-Standard eingestellt und es wurde kein Ersatz bereitgestellt.

Am nächsten bei OS X ist Grand Central Dispatch, mit dem Sie Dispatch-Warteschlangen erstellen können, die 'Blöcke' (im Wesentlichen Funktionen) ausführen. Die Verarbeitung dieser Warteschlangen kann angehalten und fortgesetzt werden, ähnlich wie bei Fasern, obwohl Sie die Ausführung nicht stoppen und in der Mitte eines Blocks fortsetzen können.

Es gibt auch Boost.Context, die ähnliche Funktionalität zu ucontext bietet (und vielleicht sogar intern verwendet), obwohl es eine C++ - Bibliothek ist.