Я пробовал boost :: fiber :: барьер, и я не могу выяснить, почему следующие блокировки кода:
#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
Я скопировал свой собственный алгоритм планировщика тестов в тестовый код и вижу, что через некоторое время не работает ни одно волокно, локальное волокно с идентификатором 1 просто не продолжается.
Boost версия 1.63 с предварительно скомпилированным пакетом visual studio 2015, компиляция в 64-битной версии
Я попробовал программу на Debian / unstable с boost-1.63.0 и могу подтвердить проблему. Когда я запускаю программу, используя Valgrind сообщается о доступе к неинициализированной памяти, а затем и о недопустимых чтениях, так что, я думаю, проблема именно в этой конкретной улучшенной версии.
Код никогда не заходит в тупик для меня, но есть некоторые переменные для рассмотрения: я на 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
Это может быть не то, что вам нужно, но, поскольку это работает для меня, я не могу вам помочь.
менять
boost::fibers::barrier barrier(2);
в
boost::fibers::barrier barrier(4);
или дождитесь выхода boost-1.64