| //===----------------------------------------------------------------------===// | 
 | // | 
 | //                     The LLVM Compiler Infrastructure | 
 | // | 
 | // This file is dual licensed under the MIT and the University of Illinois Open | 
 | // Source Licenses. See LICENSE.TXT for details. | 
 | // | 
 | //===----------------------------------------------------------------------===// | 
 |  | 
 | // <thread> | 
 |  | 
 | // class thread | 
 |  | 
 | // void detach(); | 
 |  | 
 | #include <thread> | 
 | #include <new> | 
 | #include <cstdlib> | 
 | #include <cassert> | 
 |  | 
 | class G | 
 | { | 
 |     int alive_; | 
 | public: | 
 |     static int n_alive; | 
 |     static bool op_run; | 
 |  | 
 |     G() : alive_(1) {++n_alive;} | 
 |     G(const G& g) : alive_(g.alive_) {++n_alive;} | 
 |     ~G() {alive_ = 0; --n_alive;} | 
 |  | 
 |     void operator()() | 
 |     { | 
 |         assert(alive_ == 1); | 
 |         assert(n_alive == 1); | 
 |         op_run = true; | 
 |     } | 
 | }; | 
 |  | 
 | int G::n_alive = 0; | 
 | bool G::op_run = false; | 
 |  | 
 | int main() | 
 | { | 
 |     { | 
 |         std::thread t0((G())); | 
 |         assert(t0.joinable()); | 
 |         t0.detach(); | 
 |         assert(!t0.joinable()); | 
 |         std::this_thread::sleep_for(std::chrono::milliseconds(250)); | 
 |         assert(G::op_run); | 
 |         assert(G::n_alive == 0); | 
 |     } | 
 | } |