首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从线程2启动线程1中的boost光纤

从线程2启动线程1中的boost光纤
EN

Stack Overflow用户
提问于 2022-06-26 01:32:42
回答 2查看 141关注 0票数 1

我有一个主linux线程(th1),它使用boost优先级调度程序运行许多boost光纤。

通常,我希望从另一个线程(th2)启动一个光纤,该线程将在th1中运行,并与其他th1光纤一起调度。在th1中启动光纤的代码如下所示:

代码语言:javascript
运行
复制
void launchFiber()
{
boost::fibers::use_scheduling_algorithm< priority_scheduler >()
boost::fibers::fiber *fib = new boost::fibers::fiber(fb_fiberFunction);
priority_props & props( fib->properties< priority_props >() );
props.set_priority(FiberPriorityValue);
props.name = "Fiber Name";
fib->detach();
}

当我从launchFiber调用th1函数时,启动代码工作得很好,但是当我从Th2调用它时,它就不能工作了--看起来光纤没有被添加到th1光纤队列中。为了保护光纤队列,我在th1 priority_scheduler例程中添加了互斥锁,但这似乎没有帮助。

在我看来,当涉及多个线程时,我似乎不太明白光纤系统是如何工作的。我试过查看库源代码,但对我来说并不是很清楚。

我的猜测是,如果我正确理解,这将是很简单的。有人能给我举个例子说明我是怎么做到的吗。

EN

回答 2

Stack Overflow用户

发布于 2022-06-26 11:52:59

与系统线程相反,光纤是基于协同调度的。这意味着您应该手动通知调度程序何时可以调度另一个光纤。在此用户定义的调度点期间,调度程序可以选择最佳的调度光纤.在这里,调度程序将选择优先级最高的调度程序。如果没有优先级较高的光纤,则相同的光纤可以恢复其执行。文档指出:

每根光纤都有自己的堆栈。光纤可以保存当前执行状态,包括所有寄存器和CPU标志、指令指针和堆栈指针,然后恢复此状态。其思想是使用协作调度在单个线程上运行多个执行路径(相对于先发制人的线程)。运行中的光纤显式地决定何时允许另一个光纤运行(上下文切换)。 控制是在给定线程上启动的光纤之间协同传递的。在给定的时刻,在给定的线程上,最多只运行一根光纤。在给定线程上生成额外的光纤并不会在更多的硬件核心上分发您的程序,尽管它可以更有效地利用运行它的核心。

this_fiber::yield()用于对当前光纤执行实际的产量操作。

请注意,如果使用基本的基本互斥/条件变量在线程之间移动(在默认情况下不是这样),并且使用基本互斥/条件变量的也不安全,则它们与线程本地存储不安全,特别是如果出现在受保护代码(关键部分)的中间,会导致死锁。它也可能是次优的,因为互斥可以导致当前线程被抢占或被动等待,而另一个光纤可以进行计算。Boost为更安全/更高效的纤维提供了替代的同步机制,尽管人们仍然需要关注这一点。这就是光纤不能用于盲目执行任意代码的原因。

有关更多信息,您可以从示例开始查看最简单的

票数 0
EN

Stack Overflow用户

发布于 2022-06-27 20:44:18

我确实花了一些时间研究这个问题。结果是,执行命令:boost::fibers::use_scheduling_algorithm< priority_scheduler >()使用自己的光纤队列创建了一个新的priority_scheduler对象。这个调度程序与特定于它正在运行的线程的上下文相关联。因此,在我的情况下,当我创建一个新的光纤时,它最终出现在特定于调用线程(th2,它没有运行光纤)的队列中,而不是运行我所有光纤的线程th1中。

因此,我放弃了创建一个在th1中运行的光纤的想法,通过一个来自th2的调用。我现在使用一个队列,它对来自外部线程的光纤启动请求进行排队。光纤线程(th1)在执行调度程序pick_next()函数时将检查此队列,如果存在请求,则创建光纤并将其添加到Th1的调度器队列中。它工作得很好--尽管我有一个中间队列,但我希望没有这个队列(仅出于美学原因)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72758337

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档