2015-05-18 13 views
6

Lo chiedo per curiosità.equivalente Mac OS dell'API Fibre Windows?

Windows fornisce ciò che chiamano uno Fibers API, che è un'API per processi/thread utente leggeri.

Mi interessava sapere se Mac OS offre anche tali funzionalità. Per quanto ho potuto scoprire, l'equivalente Unix più simile a quello sarebbe la famiglia di funzioni setcontext. Tuttavia, il tentativo di chiamare tale API su un programma Mac produce avvertenze che dicono che le funzioni sono state deprecate da OSX 10.6. Inoltre, quando provo a compilare ed eseguire l'esempio fornito nel link di Wikipedia sopra, ottengo un errore di seg sulla mia macchina al primo swapcontext.

Quindi apparentemente l'API setcontext è un no go per Mac. Almeno non più. C'è un altro modo per ottenere thread utente lato leggero su Mac OS? Il sistema fornisce tale funzionalità?

+1

Hai guardato Grand Central Dispatch? –

+0

@ScottHunter, conosco parte del framework GCD. Ma permette, ad esempio, di passare manualmente tra i thread di lavoro, come avviene con le fibre? Non credo che GCD possa essere considerato equivalente ai thread sul lato utente ... – glampert

+0

Non mi arrenderei necessariamente su Mac OS setcontext() abbastanza rapidamente ... le funzioni deprecate di solito funzionano ancora; semplicemente non sono garantiti per essere supportati nelle versioni future del sistema operativo. Quindi potrebbe essere solo questione di modificare alcuni dettagli per ottenere setcontext() che funziona sotto MacOS. –

risposta

2

No, non esiste alcun equivalente su OS X (o sulla maggior parte dei sistemi basati su UNIX). La serie di funzioni ucontext è stata ritirata dallo standard POSIX e non è stata fornita alcuna sostituzione.

Il più vicino possibile su OS X è Grand Central Dispatch, che consente di creare code di invio che eseguono 'blocchi' (essenzialmente funzioni). L'elaborazione di queste code può essere sospesa e ripresa, simile alle fibre, anche se non è possibile fermarsi e riprendere l'esecuzione nel mezzo di un blocco.

C'è anche Boost.Context, che fornisce funzionalità simili a ucontext (e forse addirittura lo utilizza internamente), anche se è una libreria C++.