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