这是我在boost文档中找到的一个示例的完整版本,其中介绍了如何生成工作线程以与光纤work_stealing algo一起使用。
#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的源代码,但没有安装它。该项目使用相同的编译器构建。(libc++没有在任何地方安装。)我对git分支、掌握和开发以及1_67_0都有同样的行为。我觉得我漏掉了一些显而易见的东西。
发布于 2018-08-21 07:32:53
这是一个缺陷,将在分支开发中修复。问题是,在内部容器中窃取工作的标志的注册没有正确地同步。你的例子看起来应该是:
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-21 06:50:38
我找到了另一个示例,它使用示例文件夹中的barrier.hpp,而不是促进:纤维::屏障。其他的一切都一样,就像魅力一样。
这意味着,尽管文档声明“此库提供的光纤同步对象在默认情况下将安全地同步运行在不同线程上的光纤”,但(来源)实际上并不是线程安全。我现在认识到,从来没有人说过这些是线程安全,但我仍然认为(与我最初工作的底层的示例相结合)是非常误导的。如果你非常密切地注意,并假设每一个词都是故意放置的,你就能看穿这个无意中的欺骗。
https://stackoverflow.com/questions/51925502
复制相似问题