2015-05-18 2 views
6

Я прошу об этом из любопытства.Mac OS эквивалент API Windows Fibers?

Windows предоставляет то, что они называют Fibers API, который представляет собой API для легких пользовательских процессов/потоков.

Мне было интересно узнать, поддерживает ли Mac OS такие функции. Насколько я могу судить, самым близким эквивалентом Unix к этому будет семейство функций setcontext. Тем не менее, попытка вызвать такой API в программе Mac вызывает предупреждения о том, что функции устарели с OSX 10.6. Кроме того, когда я пытаюсь скомпилировать и запустить пример, указанный в ссылке Википедии выше, я получаю ошибку seg на моей машине в начале swapcontext.

Таким образом, очевидно, что API setcontext не подходит для Mac. По крайней мере, не больше. Есть ли другой способ добиться легкого потока пользователей на Mac OS? Обеспечивает ли система такую ​​функциональность?

+1

Вы смотрели Grand Central Dispatch? –

+0

@ScottHunter, я знаю некоторые рамки GCD. Но позволяет ли это, например, вручную переключаться между нитями работы, например, с волокнами? Я не думаю, что GCD можно рассматривать как эквивалент пользовательских потоков ... – glampert

+0

Я бы не отказался от Mac OS setcontext() довольно быстро ... устаревшие функции обычно работают; они просто не гарантируются в будущих выпусках ОС. Так что это может быть просто вопрос настройки некоторых деталей, чтобы получить setcontext(), работающий под MacOS. –

ответ

2

Нет, на OS X нет эквивалентов (или большинство систем на базе UNIX, если на то пошло). Функции серии ucontext были устаревшими по стандарту POSIX, и никакая замена не была предоставлена.

Ближе всего вы можете получить на OS X Grand Central Dispatch, что позволяет создавать очереди отправки, которые выполняют «блоки» (по существу, функции). Обработка этих очередей может быть приостановлена ​​и возобновлена, подобно волокнам, хотя вы не можете остановить и возобновить выполнение в середине блока.

Существует также Boost.Context, что обеспечивает аналогичную функциональность ucontext (и, возможно, даже использует его внутри), хотя это библиотека C++.