Starałem się boost :: :: włókna barierę i nie mogę dowiedzieć się, dlaczego następujące zakleszczenia kod:Dlaczego mój kod doładowania włókno deadlocking
#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;
}
Jeżeli ustawić uruchomienie jako „wysyłki” go może przejść. A więc ma coś z kolejnością biegania, ale nie wiem, co jest nie tak. Tak więc próbowałem sobie wyobrazić, jak blokowanie idzie za sceną, co działa, itp., Ale po prostu nie mogę się dowiedzieć, dlaczego oryginalny kod nie może się skończyć.
Jeśli ktoś nie chce go wypróbować, pozwól mi położyć tutaj wyjście widzę:
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
mam skopiowany harmonogram niestandardowy algorytm testową kopalni w kodzie testowym i widzę, że po pewnym czasie, żadne włókno nie jest dostępne do biegania, lokalne włókno id 1 po prostu nie kontynuuje.
wersja Boost jest 1.63 z visual studio 2015 pakiet skompilowany i kompilacja jest w 64bit
Dzięki, nie spróbowałem valgrind na tym przykładzie, dziękuję za to potwierdzenie. – newhouse