1*7a6aaf9bSLouis Dionne //===----------------------------------------------------------------------===//
2*7a6aaf9bSLouis Dionne //
3*7a6aaf9bSLouis Dionne // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*7a6aaf9bSLouis Dionne // See https://llvm.org/LICENSE.txt for license information.
5*7a6aaf9bSLouis Dionne // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*7a6aaf9bSLouis Dionne //
7*7a6aaf9bSLouis Dionne //===----------------------------------------------------------------------===//
8*7a6aaf9bSLouis Dionne 
9*7a6aaf9bSLouis Dionne // <thread>
10*7a6aaf9bSLouis Dionne 
11*7a6aaf9bSLouis Dionne // class thread
12*7a6aaf9bSLouis Dionne 
13*7a6aaf9bSLouis Dionne // thread(const thread&) = delete;
14*7a6aaf9bSLouis Dionne 
15*7a6aaf9bSLouis Dionne #include <thread>
16*7a6aaf9bSLouis Dionne #include <new>
17*7a6aaf9bSLouis Dionne #include <cstdlib>
18*7a6aaf9bSLouis Dionne #include <cassert>
19*7a6aaf9bSLouis Dionne 
20*7a6aaf9bSLouis Dionne class G
21*7a6aaf9bSLouis Dionne {
22*7a6aaf9bSLouis Dionne     int alive_;
23*7a6aaf9bSLouis Dionne public:
24*7a6aaf9bSLouis Dionne     static int n_alive;
25*7a6aaf9bSLouis Dionne     static bool op_run;
26*7a6aaf9bSLouis Dionne 
27*7a6aaf9bSLouis Dionne     G() : alive_(1) {++n_alive;}
28*7a6aaf9bSLouis Dionne     G(const G& g) : alive_(g.alive_) {++n_alive;}
29*7a6aaf9bSLouis Dionne     ~G() {alive_ = 0; --n_alive;}
30*7a6aaf9bSLouis Dionne 
31*7a6aaf9bSLouis Dionne     void operator()()
32*7a6aaf9bSLouis Dionne     {
33*7a6aaf9bSLouis Dionne         assert(alive_ == 1);
34*7a6aaf9bSLouis Dionne         assert(n_alive >= 1);
35*7a6aaf9bSLouis Dionne         op_run = true;
36*7a6aaf9bSLouis Dionne     }
37*7a6aaf9bSLouis Dionne 
38*7a6aaf9bSLouis Dionne     void operator()(int i, double j)
39*7a6aaf9bSLouis Dionne     {
40*7a6aaf9bSLouis Dionne         assert(alive_ == 1);
41*7a6aaf9bSLouis Dionne         assert(n_alive >= 1);
42*7a6aaf9bSLouis Dionne         assert(i == 5);
43*7a6aaf9bSLouis Dionne         assert(j == 5.5);
44*7a6aaf9bSLouis Dionne         op_run = true;
45*7a6aaf9bSLouis Dionne     }
46*7a6aaf9bSLouis Dionne };
47*7a6aaf9bSLouis Dionne 
48*7a6aaf9bSLouis Dionne int G::n_alive = 0;
49*7a6aaf9bSLouis Dionne bool G::op_run = false;
50*7a6aaf9bSLouis Dionne 
51*7a6aaf9bSLouis Dionne int main(int, char**)
52*7a6aaf9bSLouis Dionne {
53*7a6aaf9bSLouis Dionne     {
54*7a6aaf9bSLouis Dionne         assert(G::n_alive == 0);
55*7a6aaf9bSLouis Dionne         assert(!G::op_run);
56*7a6aaf9bSLouis Dionne         std::thread t0(G(), 5, 5.5);
57*7a6aaf9bSLouis Dionne         std::thread::id id = t0.get_id();
58*7a6aaf9bSLouis Dionne         std::thread t1 = t0;
59*7a6aaf9bSLouis Dionne         assert(t1.get_id() == id);
60*7a6aaf9bSLouis Dionne         assert(t0.get_id() == std::thread::id());
61*7a6aaf9bSLouis Dionne         t1.join();
62*7a6aaf9bSLouis Dionne         assert(G::n_alive == 0);
63*7a6aaf9bSLouis Dionne         assert(G::op_run);
64*7a6aaf9bSLouis Dionne     }
65*7a6aaf9bSLouis Dionne 
66*7a6aaf9bSLouis Dionne   return 0;
67*7a6aaf9bSLouis Dionne }
68