Подтвердить что ты не робот

Почему мой код форсированного волокна блокируется

Я опробовал 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

Я скопировал собственный тестовый алгоритм планировщика шахт в тестовый код, и я вижу, что через какое-то время ни один волокно не доступен для использования, локальный слой id 1 просто не продолжается.

Версия Boost 1.63 с предварительно скомпилированным пакетом visual studio 2015, а компиляция - в 64-битной

4b9b3361

Ответ 1

Я попробовал программу на Debian/unstable с boost-1.63.0, и я могу подтвердить эту проблему. Когда я запускаю программу, используя valgrind, сообщается о доступе к неинициализированной памяти, а затем также недопустимые чтения, поэтому я думаю, проблема в том, что специальная версия ускорения.

Ответ 2

Код никогда не срабатывает для меня, но есть некоторые переменные: я нахожусь на 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

FYI - я скомпилировал и выполнил следующее:

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

Это может быть не то, что вам нужно, но поскольку оно работает для меня, я не могу вам помочь.

Ответ 3

изменить

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

к

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

или подождите, пока не будет выпущен boost-1.64