13

我已经尝试过 boost::fibers::barrier ,但我无法找出以下代码死锁的原因:

#include <boost/fiber/all.hpp>
#include <iostream>
#include <boost/range/algorithm/generate.hpp>
#include <boost/range/algorithm/for_each.hpp>

void barrier_test()
{
    boost::fibers::barrier barrier(2);
    std::vector<boost::fibers::fiber> myfibers(4);
    boost::generate(myfibers, [&barrier]() {
        return boost::fibers::fiber([](boost::fibers::barrier& barrier) {
            static unsigned id_inc = 0;
            const auto id = ++id_inc;
            std::cout << "fiber id: " << boost::this_fiber::get_id() << " - local id: " << id << std::endl;
            barrier.wait();
            std::cout << "barrier passed, fiber id: " << boost::this_fiber::get_id() << " - local id: " << id << std::endl;
        }, std::ref(barrier) );
    });

    std::cout << "main fiber: " << boost::this_fiber::get_id() << std::endl;
    boost::for_each(myfibers, [](boost::fibers::fiber& aFiber) {
            aFiber.join();
    });
    std::cout << "end of program" << std::endl;
}

如果我将启动设置为“调度”,它可以通过。所以它有一些运行顺序,但我不知道出了什么问题。所以我试图想象锁定是如何在幕后进行的,什么在运行等等,但我就是不知道为什么原始代码无法完成。

如果有人不想尝试,让我把我看到的输出放在这里:

main fiber: 000000000042C960
fiber id: 000000000042C6E0 - local id: 1
fiber id: 000000000044CF60 - local id: 2
barrier passed, fiber id: 000000000044CF60 - local id: 2
fiber id: 000000000045D020 - local id: 3
fiber id: 000000000046D0E0 - local id: 4
barrier passed, fiber id: 000000000046D0E0 - local id: 4
barrier passed, fiber id: 000000000045D020 - local id: 3

我已将我的自定义测试调度程序算法复制到测试代码中,我看到,过了一会儿,没有可用于运行的光纤,本地 id 1 光纤根本无法继续。

Boost 版本为 1.63,带有 Visual Studio 2015 预编译包,编译为 64 位

4

3 回答 3

2

代码对我来说永远不会死锁,但有一些变量需要考虑:我在 Mac 上,我使用的是 boost 1.64,我可能以不同的方式编译了 boost。

boost? ./fibers 
main fiber: 0x7f877cc02bc0
fiber id: 0x100cbce00 - local id: 1
fiber id: 0x100ebce00 - local id: 2
barrier passed, fiber id: 0x100ebce00 - local id: 2
fiber id: 0x100fbce00 - local id: 3
fiber id: 0x1010bce00 - local id: 4
barrier passed, fiber id: 0x1010bce00 - local id: 4
barrier passed, fiber id: 0x100cbce00 - local id: 1
barrier passed, fiber id: 0x100fbce00 - local id: 3
end of program

仅供参考 - 我编译并运行如下:

./bootstrap.sh --prefix=/Users/john/boost/boost_installation --without-libraries=python

./b2 install cxxflags='-std=c++14' -j 6 threading=multi variant=release link=shared stage --reconfigure

g++ -std=c++14 -I/Users/john/boost/boost_installation/include/ -L/Users/john/boost/boost_installation/lib -lboost_context -lboost_system -lboost_thread -lpthread -lboost_fiber -o fibers fibers.cpp

DYLD_LIBRARY_PATH=/Users/john/boost/boost_installation/lib

./fibers

这可能不是您需要的,但由于它对我有用,所以我无法帮助您。

于 2017-04-28T06:20:44.070 回答
1

我使用 boost-1.63.0 在 Debian/unstable 上尝试了该程序,我可以确认问题。当我使用valgrind运行程序时,报告了对未初始化内存的访问,后来也报告了无效读取,所以我猜问题出在那个特定的 boost 版本上。

于 2017-05-03T17:14:56.347 回答
-1

改变

boost::fibers::barrier barrier(2);

boost::fibers::barrier barrier(4);

或等到 boost-1.64 发布

于 2017-03-12T15:21:05.753 回答