0

以下のコードでは、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();
            }
        }
    } );
}
4

1 に答える 1

2

なぜそれが機能すると期待するのですか?これがロックせずに並行して実行さabc[400*y+x]れる場合、if ステートメントと割り当ての間で変更される可能性があり、変更されるため、ロジックが壊れます。ベクトル型自体がスレッドセーフであることは、これとは何の関係もありません。

于 2013-02-16T10:07:30.650 に答える