C ++并行循环,不使用PEOPLE锁定临界区

时间:2013-02-16 09:59:55

标签: c++ parallel-processing ppl parallel-for

在下面的代码中,有一个用PPL实现的parallel_for循环。主要问题在这里;当我评论cs.lock()和cs.unlock()时,abc向量值不正确。我使用concurrency_vector类型随机访问数组值,但它似乎无法正常工作。锁定关键部分,它工作但很慢。另外,为了加快速度,我使用索引来存储值,而不是使用2D-concurrency_vector。有什么问题,没有锁定关键部分,我错过了什么?

#include <iostream>
#include <ppl.h>

using namespace concurrency;
using namespace std;

int test_function()
{
    critical_section cs;

    concurrent_vector< double > abc( 300 * 400, 1000 );

    parallel_for ( 0, 1000, [ & ]( int k ) {
        for ( int y = 0; y < 300; y++ ) {
            for ( int x = 0; x < 400; x++ ) {

                /// k is using with some calculations for thr

                cs.lock();

                if ( thr < abc[ 400 * y + x ] ) {

                    abc[ 400 * y + x ] = thr;
                }

                cs.unlock();
            }
        }
    } );
}

1 个答案:

答案 0 :(得分:2)

为什么你期望它能起作用?如果并行运行而没有锁定,abc[400*y+x]可以并且将在if语句和赋值之间进行更改,从而破坏了您的逻辑。矢量类型本身是线程安全的,与此无关。