【问题标题】:Mac OS equivalent of the Windows Fibers API?Mac OS 相当于 Windows Fibers API?
【发布时间】:2015-07-29 10:31:13
【问题描述】:

我是出于好奇才问这个的。

Windows 提供了他们所谓的Fibers API,这是一个用于轻量级用户进程/线程的 API。

我很想知道 Mac OS 是否也提供这些功能。据我所知,与此最接近的 Unix 将是 setcontext 系列函数。但是,尝试在 Mac 程序上调用此类 API 会产生警告,指出这些函数自 OSX 10.6 以来已被弃用。另外,当我尝试编译和运行上面维基百科链接中提供的示例时,我的机器上的第一个swapcontext 出现了段错误。

显然setcontext API 不适用于 Mac。至少不再了。有没有其他方法可以在 Mac OS 上实现轻量级的用户端线程?系统是否提供这样的功能?

【问题讨论】:

  • 你看过 Grand Central Dispatch 吗?
  • @ScottHunter,我知道一些 GCD 框架。但它是否允许例如在工作线程之间手动切换,就像使用光纤一样?我不认为 GCD 可以被视为等同于用户端线程...
  • 我不一定会这么快就放弃 Mac OS setcontext() ... 已弃用的功能通常仍然有效;它们只是不能保证在未来的操作系统版本中得到支持。所以这可能只是调整一些细节以使 setcontext() 在 MacOS 下工作的问题。
  • 有些 OS X C API 已被弃用,没有替代品,除非您使用 Obj-C。您通常可以忽略它们已弃用的警告。
  • @CollinDauphinee,是的,感谢您的意见。由于我要求这个主要是为了告知自己,我不受任何特定语言的约束。您是否碰巧知道是否在 Objective-C 中的 MacOS 上公开了类似 Fibers 的 API?

标签: c windows macos fiber


【解决方案1】:

不,OS X(或大多数基于 UNIX 的系统,就此而言)没有等效的。 ucontext 系列函数已被 POSIX 标准弃用,并且没有提供替代品。

在 OS X 上最接近的是Grand Central Dispatch,它允许您创建执行“块”(本质上是函数)的调度队列。这些队列的处理可以暂停和恢复,类似于纤程,但您不能在块中间停止和恢复执行。

还有 Boost.Context,它提供与 ucontext 类似的功能(甚至可能在内部使用),尽管它是一个 C++ 库。

【讨论】:

    猜你喜欢
    • 2012-10-29
    • 2012-12-13
    • 2014-06-25
    • 2014-03-27
    • 1970-01-01
    • 2010-12-02
    • 2010-09-20
    • 2014-01-04
    • 1970-01-01
    相关资源
    最近更新 更多