java — правильно тестирует нитевые барьеры

Я реализовал барьерный класс MyBarrier которая имеет одну функцию Подождите() на котором вызывающий поток должен ждать, пока не прибудут все потоки его команды. Я хочу найти хороший способ проверить мой класс барьера потока. До сих пор я придерживался следующего подхода:

Чтобы проверить барьер нити, я сначала создаю свой барьерный объект

typedef unsigned int UINT;
UINT THREADS = 16;
MyBarrier barrier(THREADS);

Затем я порождаю кучу потоков:

atomic<UINT> Counter = 0;
SpawnThreads( &MyBarrTestFunc, THREADS, barrier, Counter );
JoinThreads( THREADS );

Функция проверки барьера, которая создается как нить, выглядит следующим образом:

MyBarrTestFunc( UINT THREADS, MyBarrier& barrier, std::atomic<UINT> Counter )
{
Counter.fetch_and_add(1);
barrier.wait();
assert((Counter% THREADS) == 0 );

Counter.fetch_and_add(1);
barrier.wait();
assert((Counter % THREADS) == 0 );

Counter.fetch_and_add(1);
barrier.wait();
assert((Counter% THREADS) == 0 );

Counter.fetch_and_add(1);
barrier.wait();
assert((Counter % THREADS) == 0 );
}

Я также создал другую функцию тестирования для проверки моего барьера внутри цикла

const UINT HURDLES = 64;
MyBarrTestFunc( UINT THREADS, MyBarrier& barrier, std::atomic<UINT> Counter )
{
for( UINT idx = 0; idx != HURDLES ; idx++ )
{
Counter.fetch_and_add(1);
barrier.wait();
assert((Counter % THREADS) == 0 );
}
}

Может кто-нибудь предложить мне, если это хорошие способы проверить барьер потока? Если нет, можете ли вы предложить надежный способ проверить мой класс барьера?

НОТА: Мой класс барьера имеет встроенный сброс. Всякий раз, когда все потоки группы достигают барьера (вызов ожидания), один из потоков сбрасывает барьер в старое состояние, чтобы он был готов к повторному использованию следующей группой потоков.

0

Решение

Задача ещё не решена.

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

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

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