void TestReaderWriterLockOnNThreads(int nThreads) { // Stress-test all interfaces for (int pc=0; pc<=100; pc+=20) { REMARK("Testing with %d threads, percent of MAX_WORK=%d...", nThreads, pc); StressRWLBody myStressBody(nThreads, pc); NativeParallelFor(nThreads, myStressBody); REMARK(" OK.\n"); } REMARK("Testing with %d threads, direct/unscoped locking mode...", nThreads); // TODO: choose direct or unscoped? CorrectRWLBody myCorrectBody(nThreads); active_writers = active_readers = 0; sim_readers = false; NativeParallelFor(nThreads, myCorrectBody); ASSERT(sim_readers || nThreads<2, "There were no simultaneous readers."); REMARK(" OK.\n"); REMARK("Testing with %d threads, scoped locking mode...", nThreads); CorrectRWLScopedBody myCorrectScopedBody(nThreads); active_writers = active_readers = 0; sim_readers = false; NativeParallelFor(nThreads, myCorrectScopedBody); ASSERT(sim_readers || nThreads<2, "There were no simultaneous readers."); REMARK(" OK.\n"); }
void TestReaderWriterLockOnNThreads(int nThreads) { // Stress-test all interfaces for (int pc=0; pc<=100; pc+=20) { REMARK("Testing with %d threads, percent of MAX_WORK=%d...", nThreads, pc); StressRWLBody myStressBody(nThreads, pc); NativeParallelFor(nThreads, myStressBody); REMARK(" OK.\n"); } int i; n_tested__sim_readers = 0; REMARK("Testing with %d threads, direct/unscoped locking mode...", nThreads); // TODO: choose direct or unscoped? // TODO: refactor the following two for loops into a shared function for( i=0; i<100; ++i ) { Harness::SpinBarrier bar0(nThreads); CorrectRWLBody myCorrectBody(nThreads,bar0); active_writers = active_readers = 0; sim_readers = false; NativeParallelFor(nThreads, myCorrectBody); if( sim_readers || nThreads==1 ) { if( ++n_tested__sim_readers>5 ) break; } } ASSERT(i<100, "There were no simultaneous readers."); REMARK(" OK.\n"); n_tested__sim_readers = 0; REMARK("Testing with %d threads, scoped locking mode...", nThreads); for( i=0; i<100; ++i ) { Harness::SpinBarrier bar0(nThreads); CorrectRWLScopedBody myCorrectScopedBody(nThreads, bar0); active_writers = active_readers = 0; sim_readers = false; NativeParallelFor(nThreads, myCorrectScopedBody); if( sim_readers || nThreads==1 ) { if( ++n_tested__sim_readers>5 ) break; } } ASSERT(i<100, "There were no simultaneous readers."); REMARK(" OK.\n"); }