Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 增压光纤工作时,防盗屏障导致SEG故障_C++_Multithreading_Boost_Fibers - Fatal编程技术网

C++ 增压光纤工作时,防盗屏障导致SEG故障

C++ 增压光纤工作时,防盗屏障导致SEG故障,c++,multithreading,boost,fibers,C++,Multithreading,Boost,Fibers,这是我在boost文档中找到的一个示例的完整版本,该示例介绍了如何生成工作线程以用于光纤工作算法 #include <iostream> #include <chrono> #include <boost/fiber/all.hpp> int main() { size_t count = std::thread::hardware_concurrency(); boost::fibers::barrier b{count}; for

这是我在boost文档中找到的一个示例的完整版本,该示例介绍了如何生成工作线程以用于光纤工作算法

#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;
}
我正在运行Fedora28,并使用gcc 8.1.1从源代码构建了Boost,但没有安装它。该项目是使用相同的编译器构建的。libc++没有安装在任何地方。我与git Branchs master和develop以及1_67_0有着相同的行为。 我觉得我在这里遗漏了一些明显的东西。

我找到了另一个,它使用的是examples文件夹,而不是。 其他一切都一样,它就像魅力一样。 这意味着,尽管文档中说明了此库提供的光纤同步对象,但默认情况下,将安全地同步在不同线程上运行的光纤。它们实际上不是线程安全的。我现在认识到,实际上从来没有说这些是线程安全的,但我仍然认为这与我最初工作时使用的底部的相结合是非常误导的。如果你仔细观察,并假设每一个单词都是故意放置的,你就可以看穿这个无意的欺骗。

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

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

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

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

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

原始样本是否也有相同的崩溃?stacktrace始终报告:对于Meth,最初的示例是这里的底部示例:它导致相同的崩溃,是的。这取决于线程数。顺便说一句,有时它会有两个线程,所以这可能真的是一个竞争条件。我移动了各种变量,测试了很多不同的配置。它们总是导致相同的故障。只有当调度算法设置为tho时,原始样本是否也有相同的崩溃?stacktrace始终报告:对于Meth,最初的示例是这里的底部示例:它导致相同的崩溃,是的。这取决于线程数。顺便说一句,有时它会有两个线程,所以这可能真的是一个竞争条件。我移动了各种变量,测试了很多不同的配置。它们总是导致相同的故障。只有当调度算法被设置为tho时,我才不需要在将来旋转线程时等待某种障碍?我不反对直接从开发部门工作。何时实施这项计划有没有时间表?不再需要障碍-对。同步是在工作线程内部完成的-请注意首先生成工作线程。该修复程序已经推出,并将成为下一个boost版本的一部分。boost-1.69.0应该在今年年底发布。当然,如果它现在自动同步,我需要首先生成工作人员:非常感谢。因此,我在未来旋转线程时根本不需要等待某种障碍?我不反对直接从开发部门工作。何时实施这项计划有没有时间表?不再需要障碍-对。同步是在工作线程内部完成的-请注意首先生成工作线程。该修复程序已经推出,并将成为下一个boost版本的一部分。boost-1.69.0应该在今年年底发布。当然,如果它现在自动同步,我需要首先生成工作人员:非常感谢。