boost fibers work_stealing 屏障导致段错误
boost fibers work_stealing barrier causes segfault
这是我在 boost 文档某处找到的一个示例的完整版本,该示例介绍了如何生成工作线程以与纤程一起使用 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;
}
大多数时候这会导致段错误,我不明白为什么。
这里是 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,使用 gcc 8.1.1 从源代码构建了 Boost,但没有安装它。该项目是使用相同的编译器构建的。 (libc++ 没有安装在任何地方。)我在 git 分支 master 和 develop 以及 1_67_0 上得到了相同的行为。
我觉得我在这里遗漏了一些明显的东西。
我找到了另一个 example which uses thread_barrier.hpp from the examples folder instead of the boost::fibers::barrier。
其他一切都一样,就像魅力一样。
这意味着尽管文档说明“默认情况下,此库提供的纤程同步对象将在不同线程上安全地同步纤程 运行”。 (source) they are not in fact threadsafe. I now recognize that it is never actually stated that these are threadsafe but I still think this (combined with the example 在我最初工作的底部)非常具有误导性。如果你仔细观察并假设每个单词都是故意放置的,你就可以识破这种无意的欺骗。
这是一个将在分支开发中修复的错误。
问题是工作窃取算法在内部容器中的注册没有正确同步。
您的示例如下所示:
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);
这是我在 boost 文档某处找到的一个示例的完整版本,该示例介绍了如何生成工作线程以与纤程一起使用 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;
}
大多数时候这会导致段错误,我不明白为什么。
这里是 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,使用 gcc 8.1.1 从源代码构建了 Boost,但没有安装它。该项目是使用相同的编译器构建的。 (libc++ 没有安装在任何地方。)我在 git 分支 master 和 develop 以及 1_67_0 上得到了相同的行为。 我觉得我在这里遗漏了一些明显的东西。
我找到了另一个 example which uses thread_barrier.hpp from the examples folder instead of the boost::fibers::barrier。
其他一切都一样,就像魅力一样。
这意味着尽管文档说明“默认情况下,此库提供的纤程同步对象将在不同线程上安全地同步纤程 运行”。 (source) they are not in fact threadsafe. I now recognize that it is never actually stated that these are threadsafe but I still think this (combined with the example 在我最初工作的底部)非常具有误导性。如果你仔细观察并假设每个单词都是故意放置的,你就可以识破这种无意的欺骗。
这是一个将在分支开发中修复的错误。 问题是工作窃取算法在内部容器中的注册没有正确同步。 您的示例如下所示:
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);