Ich habe Schub ausprobiert :: Fasern :: Barriere und ich kann der folgenden Code Deadlocks nicht herausfinden, warum:Warum Code meines Boost-Faser
#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;
}
Wenn ich den Start als „dispatch“ es eingestellt kann durchgehen. Es hat also etwas in der Reihenfolge Laufen, aber ich weiß nicht, was falsch ist. Also habe ich versucht mir vorzustellen, wie Locking hinter die Kulissen geht, was läuft, etc., aber ich kann einfach nicht herausfinden, warum der ursprüngliche Code nicht fertig ist.
Wenn jemand es nicht ausprobieren will, lassen Sie mich hier die Ausgabe habe ich sehen:
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
ich einen benutzerdefinierten Test Scheduler-Algorithmus von mir in den Testcode kopiert haben, und ich sehe, dass Nach einer Weile ist keine Faser zum Laufen mehr verfügbar, die lokale ID 1 Faser läuft einfach nicht weiter.
Boost-Version ist 1.63 mit Visual Studio 2015 vorkompilierte Paket und die Zusammenstellung ist in 64-Bit-
Danke, ich habe Valgrind an diesem Beispiel nicht versucht, danke für diese Bestätigung. – newhouse