test_std_mutex.cpp revision 12751
111482Sandreas.sandberg@arm.com/* 211482Sandreas.sandberg@arm.com * Copyright (c) 2018, Cornell University 311482Sandreas.sandberg@arm.com * All rights reserved. 411482Sandreas.sandberg@arm.com * 511482Sandreas.sandberg@arm.com * Redistribution and use in source and binary forms, with or 611482Sandreas.sandberg@arm.com * without modification, are permitted provided that the following 711482Sandreas.sandberg@arm.com * conditions are met: 811482Sandreas.sandberg@arm.com * 911482Sandreas.sandberg@arm.com * Redistributions of source code must retain the above copyright 1011482Sandreas.sandberg@arm.com * notice, this list of conditions and the following disclaimer. 1111482Sandreas.sandberg@arm.com * 1211482Sandreas.sandberg@arm.com * Redistributions in binary form must reproduce the above 1311482Sandreas.sandberg@arm.com * copyright notice, this list of conditions and the following 1411482Sandreas.sandberg@arm.com * disclaimer in the documentation and/or other materials provided 1511482Sandreas.sandberg@arm.com * with the distribution. 1611482Sandreas.sandberg@arm.com * 1711482Sandreas.sandberg@arm.com * Neither the name of Cornell University nor the names of its 1811482Sandreas.sandberg@arm.com * contributors may be used to endorse or promote products derived 1911482Sandreas.sandberg@arm.com * from this software without specific prior written permission. 2011482Sandreas.sandberg@arm.com * 2111482Sandreas.sandberg@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 2211482Sandreas.sandberg@arm.com * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, 2311482Sandreas.sandberg@arm.com * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 2411482Sandreas.sandberg@arm.com * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 2511482Sandreas.sandberg@arm.com * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR 2611482Sandreas.sandberg@arm.com * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2711482Sandreas.sandberg@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2811482Sandreas.sandberg@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF 2911482Sandreas.sandberg@arm.com * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 3011482Sandreas.sandberg@arm.com * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 3111482Sandreas.sandberg@arm.com * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 3211482Sandreas.sandberg@arm.com * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 3311482Sandreas.sandberg@arm.com * POSSIBILITY OF SUCH DAMAGE. 3411482Sandreas.sandberg@arm.com * 3511482Sandreas.sandberg@arm.com * Authors: Tuan Ta, Moyang Wang 3611482Sandreas.sandberg@arm.com */ 3711482Sandreas.sandberg@arm.com 3811482Sandreas.sandberg@arm.com#include <cstdlib> 3911482Sandreas.sandberg@arm.com#include <iostream> 4011482Sandreas.sandberg@arm.com#include <mutex> 4111482Sandreas.sandberg@arm.com#include <thread> 4211482Sandreas.sandberg@arm.com#include <vector> 4311482Sandreas.sandberg@arm.com 4411482Sandreas.sandberg@arm.com//------------------------------------------------------------------------ 4511482Sandreas.sandberg@arm.com// Create n threads, run them in parallel and wait for them in the master 4611482Sandreas.sandberg@arm.com// thread. 4711482Sandreas.sandberg@arm.com// Each child thread increments a shared variable m times 4811482Sandreas.sandberg@arm.com//------------------------------------------------------------------------ 4911482Sandreas.sandberg@arm.com 5011482Sandreas.sandberg@arm.com#define MAX_N_WORKER_THREADS 10 5111482Sandreas.sandberg@arm.com 5211482Sandreas.sandberg@arm.comint main( int argc, const char* argv[] ) 5311482Sandreas.sandberg@arm.com{ 5411482Sandreas.sandberg@arm.com int n_worker_threads = 0; 5511482Sandreas.sandberg@arm.com 5611482Sandreas.sandberg@arm.com // allocate all threads 5711482Sandreas.sandberg@arm.com std::vector< std::thread > threads; 5811482Sandreas.sandberg@arm.com 5911482Sandreas.sandberg@arm.com // mutex to protect the shared variable 6011482Sandreas.sandberg@arm.com std::mutex my_mutex; 6111482Sandreas.sandberg@arm.com 6211482Sandreas.sandberg@arm.com // variable shared among all threads 6311482Sandreas.sandberg@arm.com int shared_var = 0; 6411482Sandreas.sandberg@arm.com 6511482Sandreas.sandberg@arm.com // number of steps each thread increments the shared_var 6611482Sandreas.sandberg@arm.com int nsteps = 1000; 6711482Sandreas.sandberg@arm.com 6811482Sandreas.sandberg@arm.com for ( int tid = 0; tid < MAX_N_WORKER_THREADS; ++tid ) { 6911482Sandreas.sandberg@arm.com try { 7011482Sandreas.sandberg@arm.com threads.push_back( std::thread( [&] { 7111482Sandreas.sandberg@arm.com std::lock_guard<std::mutex> guard(my_mutex); 7211482Sandreas.sandberg@arm.com for ( int i = 0; i < nsteps; ++i ) 7311482Sandreas.sandberg@arm.com shared_var++; 7411482Sandreas.sandberg@arm.com } ) ); 7511482Sandreas.sandberg@arm.com } catch ( const std::system_error& err ) { 7611482Sandreas.sandberg@arm.com break; 7711482Sandreas.sandberg@arm.com } 7811482Sandreas.sandberg@arm.com n_worker_threads++; 7911482Sandreas.sandberg@arm.com } 8011482Sandreas.sandberg@arm.com 8111482Sandreas.sandberg@arm.com // sync up all threads 8211482Sandreas.sandberg@arm.com for (int i = 0; i < n_worker_threads; ++i) { 8311482Sandreas.sandberg@arm.com threads[i].join(); 8411482Sandreas.sandberg@arm.com } 8511482Sandreas.sandberg@arm.com 8611482Sandreas.sandberg@arm.com // verify 8711482Sandreas.sandberg@arm.com if ( shared_var != n_worker_threads * nsteps || n_worker_threads < 1) { 8811482Sandreas.sandberg@arm.com return EXIT_FAILURE; 8911482Sandreas.sandberg@arm.com } 9011482Sandreas.sandberg@arm.com 9111482Sandreas.sandberg@arm.com return EXIT_SUCCESS; 9211482Sandreas.sandberg@arm.com} 9311482Sandreas.sandberg@arm.com