代码之家  ›  专栏  ›  技术社区  ›  kreuzerkrieg

boost::光纤调度-何时以及如何

  •  0
  • kreuzerkrieg  · 技术社区  · 7 年前

    根据文件

    当前运行的光纤在调用某些 将控制权传递给管理器的操作

    我只能考虑一个手术- boost::this_fiber::yield 这可能导致控制从光纤切换到光纤。但是,当我运行

    bf::fiber([](){std::cout << "Bang!" << std::endl;}).detach();
    bf::fiber([](){std::cout << "Bung!" << std::endl;}).detach();
    

    我得到的输出像

    砰!笨蛋!
    \ n个
    \ n个

    也就是说控制权是在 << 从一根光纤到另一根光纤的操作员。怎么会这样?为什么?在以下情况下,控制从光纤传递到光纤的一般定义是什么 boost::fiber 图书馆?

    编辑001: 没有密码就无法逃脱:

    #include <boost/fiber/fiber.hpp>
    #include <boost/fiber/mutex.hpp>
    #include <boost/fiber/barrier.hpp>
    #include <boost/fiber/algo/algorithm.hpp>
    #include <boost/fiber/algo/work_stealing.hpp>
    
    namespace bf = boost::fibers;
    
    class GreenExecutor
    {
        std::thread worker;
        bf::condition_variable_any cv;
        bf::mutex mtx;
        bf::barrier barrier;
    public:
        GreenExecutor() : barrier {2}
        {
            bf::use_scheduling_algorithm<bf::algo::work_stealing>(2);
    
            worker = std::thread([this] {
                bf::use_scheduling_algorithm<bf::algo::work_stealing>(2);
                // wait till all threads joining the work stealing have been registered
                barrier.wait();
                mtx.lock();
                // suspend main-fiber from the worker thread
                cv.wait(mtx);
                mtx.unlock();
            });
            // wait till all threads have been registered the scheduling algorithm
            barrier.wait();
        }
    
        template<typename T>
        void PostWork(T&& functor)
        {
            bf::fiber {std::move(functor)}.detach();
        }
    
        ~GreenExecutor()
        {
            cv.notify_all();
            worker.join();
        }
    };
    
    int main()
    {
        GreenExecutor executor;
        std::this_thread::sleep_for(std::chrono::seconds(1));
        int i = 0;
        for (auto j = 0ul; j < 10; ++j) {
            executor.PostWork([idx {++i}]() {
                auto res = pow(sqrt(sin(cos(tan(idx)))), M_1_PI);
                std::cout << idx << " - " << res << std::endl;
            });
        }
        while (true) {
            boost::this_fiber::yield();
        }
        return 0;
    }
    

    输出

    2-1--南
    0.503334 3-4-0.861055
    0.971884 5-6-0.968536
    -南7-8-0.921959
    0.9580699
    -10-0.948075
    0.961811个

    1 回复  |  直到 7 年前
        1
  •  0
  •   kreuzerkrieg    7 年前

    好吧,有几件事我错过了,首先,我的结论是基于对工作原理的误解 boost::fiber
    问题中提到的构造函数中的行 bf::use_scheduling_algorithm<bf::algo::work_stealing>(2);
    GreenExecutor 实例已创建(在主线程中),因此,在启动两个工作线程时 fiber 我实际上启动了两个线程,它们将处理提交的 纤维 S反过来处理这些 fibers 异步混合 std::cout 输出。没有魔法,一切都如期而至, boost::fiber::yield 仍然是将控制权从一根光纤传递到另一根光纤的唯一选择