Это законченная версия примера, который я нашел где-то в документах для надстроек о том, как порождать рабочие потоки для использования с волокнами. Алгоритм work_stealing.
#include <iostream>
#include <chrono>
#include <boost/fiber/all.hpp>
int main() {
size_t count = std::thread::hardware_concurrency();
boost::fibers::barrier b{count};
for(int i=0;i<count;i++) {
new std::thread([&b, &count] {
boost::fibers::use_scheduling_algorithm<boost::fibers::algo::work_stealing>(count);
b.wait();
});
}
std::this_thread::sleep_for(std::chrono::seconds(5));
return 0;
}
Это вызывает segfault большую часть времени, и я не понимаю, почему.
Вот файл cmake:
cmake_minimum_required(VERSION 3.12)
set(CMAKE_CXX_STANDARD 17)
set(VERSION 1_68_0)
set(BOOST_ROOT /home/User/boost_${VERSION})
find_package(Boost REQUIRED COMPONENTS fiber)
find_package(Threads)
include_directories(${Boost_INCLUDE_DIRS})
add_executable(test test.cpp)
target_link_libraries(test ${Boost_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT})
Я использую Fedora 28, собрал Boost из исходного кода с помощью gcc 8.1.1 и не установил его. Проект построен с тем же компилятором. (libc ++ нигде не установлен.) Я получаю то же поведение с мастером веток git и развиваю, как и 1_67_0.
Я чувствую, что упускаю что-то очевидное здесь.
Это ошибка, которая будет исправлена в ветке разработки.
Проблема в том, что регистрация алгоритмов кражи работ во внутреннем контейнере не синхронизирована должным образом.
Ваш пример будет выглядеть так:
size_t count = std::thread::hardware_concurrency();
for(size_t i=1;i<count;i++) {
new std::thread([&count] {
boost::fibers::use_scheduling_algorithm<boost::fibers::algo::work_stealing>(count);
});
}
boost::fibers::use_scheduling_algorithm<boost::fibers::algo::work_stealing>(count);
Я нашел другой пример который использует thread_barrier.hpp из папки примеров вместо повышение :: волокна :: барьер.
Все остальное тоже самое, работает как шарм.
Это означает, что, несмотря на документацию, в которой говорится: «Объекты синхронизации волокон, предоставляемые этой библиотекой, по умолчанию будут безопасно синхронизировать волокна, работающие в разных потоках». (источник) на самом деле они не безопасны. Теперь я признаю, что на самом деле никогда не утверждается, что они безопасны для потоков, но я все еще думаю это (в сочетании с пример внизу я изначально работал) очень вводит в заблуждение. Если вы обратите очень пристальное внимание и предположите, что каждое отдельное слово было помещено преднамеренно, вы могли бы видеть сквозь этот непреднамеренный обман.