我试过了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;
}
Run Code Online (Sandbox Code Playgroud)
如果我将发布设置为"发送",它可以通过.所以它有运行顺序,但我不知道出了什么问题.所以我试图想象锁定是如何落后于场景,运行的是什么等等,但我无法找到原因,为什么原始代码无法完成.
如果有人不想尝试,请让我把输出放在这里:
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
Run Code Online (Sandbox Code Playgroud)
我已经将我的自定义测试调度程序算法复制到测试代码中,我看到,经过一段时间后,没有光纤可用于运行,本地id 1光纤根本就没有继续.
使用visual studio 2015预编译软件包的Boost版本是1.63,编译是64位
我在 Debian/unstable 上使用 boost-1.63.0 尝试了该程序,可以确认问题。当我使用valgrind运行程序时,会报告对未初始化内存的访问,随后还会出现无效读取,所以我猜问题出在该特定的 boost 版本上。
| 归档时间: |
|
| 查看次数: |
421 次 |
| 最近记录: |