Параллельный цикл C ++ без блокировки критической секции с использованием PPL

в приведенном ниже коде есть цикл parallel_for, реализованный с помощью PPL. Основная проблема здесь; Значения вектора abc неверны, когда я прокомментировал cs.lock () и cs.unlock (). Я использую тип 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();
}
}
} );
}

0

Решение

Почему вы ожидаете, что это сработает? Если это работает параллельно без блокировки, abc[400*y+x] можно и будет меняться между оператором if и присваиванием, тем самым нарушая вашу логику. Сам векторный тип, являющийся потокобезопасным, не имеет к этому никакого отношения.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]