【问题标题】:I have some question about fiber in windows我对 Windows 中的纤维有一些疑问
【发布时间】:2019-06-01 11:23:22
【问题描述】:

我想了解window提供的光纤。

假设我创建了 4 个纤程。

------------线程------

纤维1 - 纤维2 - 纤维3 - 纤维4

^

Fiber 1 现在线程执行。

  1. 一个线程只能同时运行一个纤程。对吗?

  2. 如果一个线程终止了 fiber1,那么另一个线程的所有纤程也会终止吗?

  3. 我知道光纤是非抢占式的。那么如果我想把fiber1切换到fiber2,有没有办法只能在fiber1中调用SwitchToFiber呢?

  4. 如果我在执行某些任务期间在 Fiber1 中调用 SwitchToFiber,那么 Fiber1 会立即休眠吗?还是在完成任务后睡觉?

  5. fiber1到fiber4没有共享空间?

  6. 而且没有共享空间,那么也就没有必要锁定光纤。对吗?

我阅读了 MSDN 文档,但有些东西我听不懂。所以我在这里问。

【问题讨论】:

  • 1.是 2. 光纤不能终止,可以通过DeleteFiber 删除。这个调用不会影响另一个纤程 3. 是的,只能通过调用SwitchToFiber 4. 甚至不休眠,这是不正确的,您只需将上下文切换到调用SwitchToFiber 内的另一个纤程。 5. 共享空间是什么意思?
  • Fiber 仅在出于某种原因需要以与 Windows 不同的方式手动调度线程时(非常不可能)才有用。大多数人从不使用它们。
  • 表示共享内存。我想知道它们(光纤1到光纤4)都可以访问的内存。
  • 如果他们不能同时访问共享内存,我认为没有必要锁定。这是对的吗?

标签: c++ multithreading winapi fibers


【解决方案1】:

SwitchToFiber 类似于longjmpCreateFiber 类似于setjmp 的扩展版本,它分配了额外的堆栈空间。 DeleteFiber 类似于setjmp 分配的上下文块的free。最重要的是,付出者自己什么也不做,longjmp 就像 C 语言的 goto 的扩展版本,例如类似于 gcc 的“computed goto”扩展,除了它可以在跳转时切换堆栈。您可以使用setjmplongjmp 和一些alloca 轻松模拟光纤(非便携式)。

【讨论】:

  • 我说 setjmp/longjmp 和光纤之间存在明显的差异。光纤有自己的堆栈。 setjmp 只是保存上下文(寄存器)和 longjmp 恢复保存的上下文。有了这个,我们从调用 longjmp 的地方丢失了上下文(本地变量、调用堆栈等)。还需要分配单独的堆栈并切换它以模拟光纤。 setjmp 也是保存当前线程上下文,当 CreateFiber - 创建新上下文时,而不是保存当前。
  • 光纤中的堆栈当然是它们的区别,但在功能方面——它们非常相似。都是非本地 goto,它们的高级语义是相同的。这直接回答了与纤维“暂停”或“运行直到”等相关的所有问题。纤维不能做这样的事情,因为非本地 goto 也不会:)
猜你喜欢
  • 1970-01-01
  • 2021-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-28
  • 2020-08-14
  • 1970-01-01
相关资源
最近更新 更多