Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.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
QT::地图分割错误_Qt_Qtconcurrent - Fatal编程技术网

QT::地图分割错误

QT::地图分割错误,qt,qtconcurrent,Qt,Qtconcurrent,当我尝试使用QtConcurrent::map实现“parallel for”时: QFuture<void> parForAsync(size_t n, std::function<void (size_t)> Op) { size_t nThreads = static_cast<size_t>(QThreadPool::globalInstance()->maxThreadCount()); size_t

当我尝试使用QtConcurrent::map实现“parallel for”时:

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();
    });
}
QFuture parForAsync(大小、标准::功能操作)
{
尺寸=
静态_cast(QThreadPool::globalInstance()->maxThreadCount());
尺寸nn=n/n读数+1;
使用序列=QVector;
序列vFuns;
对于(大小i=0;in?n:i+nn;
vFuns.push_back([=]()->void
{
对于(大小i=firstIdx;ireturn QtConcurrent::map/我无法重现您的案例,但我可以给您一些示例来说明这个问题

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;
}
q未来测试()
{   
QVector v;//测试函数范围内的局部变量
//准备v向量
QFuture f=QtConcurrent::map(v,someFunction);//立即返回
返回f;
}
[1]
QtConcurrent::map
通过引用而不是复制获取
v

[2]
QtConcurrent::map
立即返回

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

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

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