遍历 QFutureSynchronizer<T>::results
Iterating through QFutureSynchronizer<T>::results
谁能告诉我这些代码有什么问题:
std::vector<double> vUp;
QFuture<double> tu, td;
foreach(boost::tie(tu, td), boost::combine(Up_corr.futures(), Down_corr.futures()))
{
vUp.push_back((tu.result()+td.result())*0.5);
}
我在 运行 时遇到以下错误:
Thread 1: EXC_BAD_ACCESS (code=1, address=0x51)
Up_corr 和 Down_corr 都是 QFutureSynchronizer 并且定义明确,因为此线程中存在的第三种方法正在运行。此外,在通过上述循环之前,我正在等待 Up_corr 和 Down_corr QtConcurent::run 都完成。
此代码变体也不起作用
std::vector<double> vUp;
QList< QFuture<double> >::const_iterator tu = Up_corr.futures().cbegin();
QList< QFuture<double> >::const_iterator td = Down_corr.futures().cbegin();
for(size_t iCh = 0; iCh < 32; iCh++)
{
vUp.push_back((tu->result()+td->result())*0.5);
tu++;
td++;
}
尝试访问 tu->result() 或 td->result() 时出现同样的错误。
唯一有效的方法是:
std::vector<double> v1;
std::vector<double> v2;
foreach(QFuture<double> thread, Up_corr.futures())
v1.push_back(thread.result());
foreach(QFuture<double> thread, Down_corr.futures())
v2.push_back(thread.result());
for(size_t iCh = 0; iCh < 32; iCh++)
vUp.push_pack((v1[iCh]+v2[iCh])*0.5);
为什么最后一个工作正常,而另外两个因 BAD ACCESS 而失败?
最后一种有效的方法不是最优的:要填充一个向量,我需要三个循环。对于 32 个元素,这没什么大不了的,但是,我还需要处理 List> 的 2k 个元素,减少时间是我的 objective.
我不知道 foreach
宏,但假设它类似于基于范围的 for
它会保持 futures()
的结果。其他变体使用此结果作为表达式的一部分,然后让它消亡:只有直接绑定到 const&
或 &&
的临时绑定保持活动状态。表达式中使用的其他临时变量在完整表达式的末尾被销毁。您可能想尝试
// ...
auto&& ucf = Up_corr.futures();
auto&& dcf = Down_corr.futures();
foreach(boost::tie(tu, td), boost::combine(ucf, dcf))
{
vUp.push_back((tu.result()+td.result())*0.5);
}
谁能告诉我这些代码有什么问题:
std::vector<double> vUp;
QFuture<double> tu, td;
foreach(boost::tie(tu, td), boost::combine(Up_corr.futures(), Down_corr.futures()))
{
vUp.push_back((tu.result()+td.result())*0.5);
}
我在 运行 时遇到以下错误:
Thread 1: EXC_BAD_ACCESS (code=1, address=0x51)
Up_corr 和 Down_corr 都是 QFutureSynchronizer 并且定义明确,因为此线程中存在的第三种方法正在运行。此外,在通过上述循环之前,我正在等待 Up_corr 和 Down_corr QtConcurent::run 都完成。
此代码变体也不起作用
std::vector<double> vUp;
QList< QFuture<double> >::const_iterator tu = Up_corr.futures().cbegin();
QList< QFuture<double> >::const_iterator td = Down_corr.futures().cbegin();
for(size_t iCh = 0; iCh < 32; iCh++)
{
vUp.push_back((tu->result()+td->result())*0.5);
tu++;
td++;
}
尝试访问 tu->result() 或 td->result() 时出现同样的错误。
唯一有效的方法是:
std::vector<double> v1;
std::vector<double> v2;
foreach(QFuture<double> thread, Up_corr.futures())
v1.push_back(thread.result());
foreach(QFuture<double> thread, Down_corr.futures())
v2.push_back(thread.result());
for(size_t iCh = 0; iCh < 32; iCh++)
vUp.push_pack((v1[iCh]+v2[iCh])*0.5);
为什么最后一个工作正常,而另外两个因 BAD ACCESS 而失败?
最后一种有效的方法不是最优的:要填充一个向量,我需要三个循环。对于 32 个元素,这没什么大不了的,但是,我还需要处理 List> 的 2k 个元素,减少时间是我的 objective.
我不知道 foreach
宏,但假设它类似于基于范围的 for
它会保持 futures()
的结果。其他变体使用此结果作为表达式的一部分,然后让它消亡:只有直接绑定到 const&
或 &&
的临时绑定保持活动状态。表达式中使用的其他临时变量在完整表达式的末尾被销毁。您可能想尝试
// ...
auto&& ucf = Up_corr.futures();
auto&& dcf = Down_corr.futures();
foreach(boost::tie(tu, td), boost::combine(ucf, dcf))
{
vUp.push_back((tu.result()+td.result())*0.5);
}