Test parameters. You can specify various parameters for test. rl::test_params p; p.search_type = rl::fair_context_bound_scheduler_type; p.context_bound = 1; p.execution_depth_limit = 1000; rl::simulate(p); The main parameter is scheduler type used for simulation. There is 3 types of scheduler: random_scheduler_type - random exploration of state space fair_full_search_scheduler_type - exhaustive systematic exploration of state space fair_context_bound_scheduler_type - systematic exploration of state space with limit on context switches. For random_scheduler_type you can specify 'iteration_count' parameter - number of explored executions. For fair_context_bound_scheduler_type you can specify 'context_bound' parameter - limit on context switches. Also you can specify 'execution_depth_limit' parameter - used for livelock detection. All executions with trace longer than execution_depth_limit will be treated as livelocked (or non-terminating). Also from test_params structure you can receive output parameters from simulation. Main output parameter is 'test_result' which describes cause of test failure. If you use fair_full_search_scheduler_type or fair_context_bound_scheduler_type, in order to ensure fairness of scheduler, you must use 'yield' calls in all 'spin-loops', otherwise simulation will report non-terminating execution. Example: struct race_seq_ld_ld_test : rl::test_suite { std::atomic a; rl::var x; void before() { a($) = 0; x($) = 0; } void thread(unsigned index) { if (index) { x($).load(); a($).store(1, std::memory_order_relaxed); } else { rl::backoff b; while (0 == a($).load(rl::memory_order_relaxed)) b.yield($); x($).load(); } } };