首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QtConcurrent::map分割故障

QtConcurrent::map分割故障
EN

Stack Overflow用户
提问于 2018-09-20 19:08:43
回答 1查看 217关注 0票数 1

当我试图使用QtConcurrent::map实现"parallel“时:

代码语言:javascript
复制
QFuture<void> parForAsync(size_t n, std::function<void (size_t)> Op)
{

    size_t nThreads =
            static_cast<size_t>(QThreadPool::globalInstance()->maxThreadCount());
    size_t nn = n/nThreads + 1;

    using Sequence = QVector<std::function<void()>>;
    Sequence vFuns;

    for(size_t i = 0; i < n; i+=nn)
    {
        size_t firstIdx = i,
                lastIdx = i + nn > n ? n : i + nn;

        vFuns.push_back([=]()->void
        {
            for(size_t i = firstIdx; i < lastIdx; ++i)
            {
                Op(i);
            }
        });
    }
    return QtConcurrent::map<Sequence>    //<-Segmentation fault!
            (vFuns, [](std::function<void()> f)
    {
        f();
    });
}

我在这个地方有分割错误:

代码语言:javascript
复制
template<typename _Res, typename... _ArgTypes>
    function<_Res(_ArgTypes...)>::
    function(const function& __x)
    : _Function_base()
    {
      if (static_cast<bool>(__x))
    {
      __x._M_manager(_M_functor, __x._M_functor, __clone_functor); //<-Segmentation fault!
      _M_invoker = __x._M_invoker;
      _M_manager = __x._M_manager;
    }
    }

为什么会发生这种情况?似乎std::函数已经通过了检查。我怎样才能使这个代码工作呢?

提前感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-20 19:44:00

我不能重现你的案例,但我可以给你一些例子来说明问题。

代码语言:javascript
复制
QFuture<void> test ()
{   
    QVector<int> v; // LOCAL VARIABLE IN SCOPE OF test FUNCTION

    // preparing v vector

    QFuture<void> f = QtConcurrent::map(v,someFunction); // returns immediately
    return f;
}

1 QtConcurrent::map通过引用而不是复制来获取v

2 QtConcurrent::map立即返回。

3因此,当test函数结束时,map启动的并行操作使用v向量删除,因为它是test函数中的局部变量。

您可以将waitForFinished用于QFuture,但是您的函数没有意义,因为它一直阻塞直到并行任务结束。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52431737

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档