2017-03-10 4 views
13
Deadlocks

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-

Antwort

1

Ich habe das Programm auf Debian/Unstable mit Boost-1.63.0 versucht und ich kann das Problem bestätigen. Wenn ich das Programm mit valgrind ausführen, wird der Zugriff auf nicht initialisierten Speicher gemeldet und später auch auf ungültige Lesevorgänge, daher nehme ich an, dass das Problem bei dieser speziellen Boost-Version liegt.

+0

Danke, ich habe Valgrind an diesem Beispiel nicht versucht, danke für diese Bestätigung. – newhouse

-1

Änderung

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

zu

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

oder warten, bis Boost-1.64 freigegeben wird

+1

Dies ist keine Lösung, in diesem Fall erweitern Sie einfach die Barriere zu einer größeren Anzahl und es wird die Fasern nicht paarweise halten, aber keine. Du hast geschrieben, dass ich auf boost-1.64 warten soll, weißt du zufällig von einem Fehler? – newhouse

+0

Ich bin mit @newhouse. Wenn Sie keinen logischen Grund kennen, um die Anzahl der Barrieren zu erhöhen, ist dies bestenfalls eine Frachtkultantwort. Ich würde jedem Programmierer in meinem Team ein sehr ernstes Gespräch geben, wenn sie einen "magischen Rat" ohne jegliche Argumentation akzeptieren würden. – sehe

2

Der Code nie Deadlocks für mich, aber es gibt einige Variablen zu c onsider: Ich bin auf einem Mac, ich benutze Boost 1.64, und ich könnte Boost anders kompiliert haben.

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 

FYI - ich kompiliert und lief wie folgt aus:

./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 

Das kann nicht sein, was Sie brauchen, aber da es für mich funktioniert, kann ich Ihnen nicht helfen.

Verwandte Themen