QtConcurrent::map 分段错误
QtConcurrent::map segmentation fault
当我尝试使用 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();
});
}
我在这个地方遇到了分段错误:
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::function 似乎通过了检查。我怎样才能使这段代码工作?
提前致谢!
我无法重现你的情况,但我可以给你一些例子来说明问题
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
returns 立即。
[3] 因此,当 test
函数结束时,由 map
启动的并行操作使用 v
向量,该向量已被删除,因为它是 test
函数中的局部变量。
您可以将 waitForFinished
用于 QFuture
,但是这样您的函数就没有意义了,因为它会阻塞直到并行任务结束。
当我尝试使用 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();
});
}
我在这个地方遇到了分段错误:
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::function 似乎通过了检查。我怎样才能使这段代码工作?
提前致谢!
我无法重现你的情况,但我可以给你一些例子来说明问题
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
returns 立即。
[3] 因此,当 test
函数结束时,由 map
启动的并行操作使用 v
向量,该向量已被删除,因为它是 test
函数中的局部变量。
您可以将 waitForFinished
用于 QFuture
,但是这样您的函数就没有意义了,因为它会阻塞直到并行任务结束。