1

这是我在 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 和 development 以及 1_67_0 相同的行为。我觉得我在这里遗漏了一些明显的东西。

4

2 回答 2

3

这是一个将在分支开发中修复的错误。问题是内部容器中工作窃取算法的注册没有正确同步。您的示例如下所示:

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);
于 2018-08-21T07:32:53.747 回答
1

我找到了另一个使用示例文件夹中的thread_barrier.hpp而不是boost::fibers::barrier的示例。其他一切都一样,它就像魅力一样。
这意味着尽管文档声明“默认情况下,此库提供的光纤同步对象将安全地同步在不同线程上运行的光纤。” (来源)它们实际上不是线程安全的。我现在认识到实际上从未说过这些是线程安全的,但我仍然认为这一点(结合示例在我最初工作的底部)非常具有误导性。如果您密切注意并假设每个单词都是故意放置的,您就可以看穿这种无意的欺骗。

于 2018-08-21T06:50:38.720 回答