0

在顺序for循环中,当前迭代可以通过调用continue. 类似地,在Concurrency::parallel_for循环中,当前迭代(即调用 lambda 函数的线程)可以用return.

有时,我必须调试一个parallel_for循环,使其成为顺序并忘记将其更改return为 a continue,因为在void函数中,编译器不会抱怨。这会导致有时很难追踪的错误。

我想知道 Visual C++ 2013 是否提供任何机制来为两个循环使用相同的关键字/宏/…。这可能吗?

4

1 回答 1

2

由于您仅将顺序循环用于调试,因此您可以转换为也使用 lambda 的版本:

parallel_for (first, last, [&](size_t i)
{
    if(condition)
        return;
    do_stuff(i);
});

转变为

for (size_t i = first; i < last; i++)[&]
{
    if(condition)
        return;
    do_stuff(i);
}();

这很丑,当然。但如果它只是为了调试而存在,它就不会保持这种状态。


或者,您可以将所有 lambda 函数包装在一个执行单次迭代的循环中,并始终使用continue而不是return. 缺点是你丑化了非调试代码。

parallel_for (first, last, [&](size_t i)
{
    do {
        if(condition)
            continue; // same as return
        do_stuff(i);
    } while(0);
});

以顺序形式工作相同:

for (size_t i = first; i < last; i++)
{
    do {
        if(condition)
            continue; // same as continue without the do/while
        do_stuff(i);
    } while(0);
}
于 2016-07-26T14:38:40.473 回答