1/*
2  * Copyright (c) 2018, Cornell University
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or
6  * without modification, are permitted provided that the following
7  * conditions are met:
8  *
9  * Redistributions of source code must retain the above copyright
10  * notice, this list of conditions and the following disclaimer.
11  *
12  * Redistributions in binary form must reproduce the above
13  * copyright notice, this list of conditions and the following
14  * disclaimer in the documentation and/or other materials provided
15  * with the distribution.
16  *
17  * Neither the name of Cornell University nor the names of its
18  * contributors may be used to endorse or promote products derived
19  * from this software without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
22  * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
23  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
24  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
25  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
26  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
27  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
28  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
29  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
30  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
32  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
33  * POSSIBILITY OF SUCH DAMAGE.
34  *
35  * Authors: Moyang Wang
36  */
37
38#include <cstdlib>
39#include <iostream>
40#include <string>
41#include <thread>
42#include <vector>
43
44//------------------------------------------------------------------------
45// Test std::thread
46//------------------------------------------------------------------------
47// Create n threads, run them in parallel and wait for them in the master
48// thread.
49// Each child thread writes its thread id to an output array
50
51#define MAX_N_WORKER_THREADS 10
52
53int main( int argc, char* argv[] )
54{
55    int n_worker_threads = 0;
56
57    std::vector< std::thread > threads;
58    std::vector<int> outputs( MAX_N_WORKER_THREADS, 0 );
59
60    for ( int tid = 0; tid < MAX_N_WORKER_THREADS; ++tid ) {
61        try {
62            threads.push_back( std::thread( [&] (size_t thread_id ) {
63                        std::cout << "Hello from thread " <<  thread_id
64                                  << std::endl;
65                        outputs[thread_id] = thread_id;
66                    }, tid ) );
67        } catch ( const std::system_error& err ) {
68            break;
69        }
70        n_worker_threads++;
71    }
72
73    std::cout << "Hello from master thread" << std::endl;
74
75    // sync up all threads
76    for (int i = 0; i < n_worker_threads; ++i) {
77        threads[i].join();
78    }
79
80    if (n_worker_threads < 1) {
81        return EXIT_FAILURE;
82    }
83
84    for ( int i = 0; i < n_worker_threads; ++i ) {
85        if ( outputs[i] != i ) {
86            return EXIT_FAILURE;
87        }
88    }
89
90    return EXIT_SUCCESS;
91}
92