我已经实现了一个屏障类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 );
}
}
如果这些是测试线程障碍的好方法,谁能建议我?如果没有,你能建议一个万无一失的方法来测试我的屏障类吗?
注意:我的屏障类具有内置的重置功能。每当一个团队的所有线程都到达屏障(调用等待)时,其中一个线程将屏障重置为旧状态,以便它准备好被下一组线程重用