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);