增强纤维work_stealing障碍导致段错误

时间:2018-08-20 06:58:20

标签: c++ multithreading boost fibers

这是我在增强文档的某处发现的一个示例的完整版本,该示例如何生成与纤维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 branch master和1_67_0上也得到相同的行为。 我觉得这里缺少明显的东西。

2 个答案:

答案 0 :(得分:2)

这是一个将在分支机构开发中修复的错误。 问题在于,内部容器上的盗用算法的注册未正确同步。 您的示例如下所示:

fields

答案 1 :(得分:1)

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