Я реализовал барьерный класс 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 );
}
}
Может кто-нибудь предложить мне, если это хорошие способы проверить барьер потока? Если нет, можете ли вы предложить надежный способ проверить мой класс барьера?
НОТА: Мой класс барьера имеет встроенный сброс. Всякий раз, когда все потоки группы достигают барьера (вызов ожидания), один из потоков сбрасывает барьер в старое состояние, чтобы он был готов к повторному использованию следующей группой потоков.
Задача ещё не решена.
Других решений пока нет …