0

我已经实现了一个屏障类MyBarrier,它具有单个函数wait(),调用线程必须等待,直到他的团队的所有线程都到达。我想找到一种测试线程屏障类的好方法。到目前为止,我采取了以下方法:

为了测试线程屏障,我首先创建了我的屏障对象

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 );
   }
}

如果这些是测试线程障碍的好方法,谁能建议我?如果没有,你能建议一个万无一失的方法来测试我的屏障类吗?

注意:我的屏障类具有内置的重置功能。每当一个团队的所有线程都到达屏障(调用等待)时,其中一个线程将屏障重置为旧状态,以便它准备好被下一组线程重用

4

0 回答 0