#include <atomic>
#include <chrono>
#include <condition_variable>
#include <iostream>
#include <mutex>
#include <string>
#include <thread>
 
std::mutex mu;
std::condition_variable cv;
bool finished = false;
 
void threadFunc()
{
    for (int i = 0; i < 5; ++i)
    {
        std::this_thread::sleep_for(std::chrono::milliseconds(1));
        std::unique_lock<std::mutex> lock(mu);
        std:: cout << "Thread:  " << (0 - i) << "\n";
    }
 
    std::unique_lock<std::mutex> lock(mu);
    finished = true;
    cv.notify_one();
}
 
int main()
{
	{
    	std::thread t1(threadFunc);
    	t1.detach(); // Call `detach` to prevent blocking this thread
 
	} // Need to call `join` or `detach` before `thread` goes out of scope
 
    for (int i = 0; i < 5; ++i)
    {
        std::unique_lock<std::mutex> lock(mu);
        std::cout << "Main:  " << i << "\n";
    }
 
    std::cout << "End of Main\n";
 
    std::unique_lock<std::mutex> lock(mu);
    cv.wait(lock, [&finished]() { return finished; });
 
    return 0;
}
				I2luY2x1ZGUgPGF0b21pYz4KI2luY2x1ZGUgPGNocm9ubz4KI2luY2x1ZGUgPGNvbmRpdGlvbl92YXJpYWJsZT4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bXV0ZXg+CiNpbmNsdWRlIDxzdHJpbmc+CiNpbmNsdWRlIDx0aHJlYWQ+CgpzdGQ6Om11dGV4IG11OwpzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBjdjsKYm9vbCBmaW5pc2hlZCA9IGZhbHNlOwoKdm9pZCB0aHJlYWRGdW5jKCkKewogICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyArK2kpCiAgICB7CiAgICAgICAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMSkpOwogICAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtdSk7CiAgICAgICAgc3RkOjogY291dCA8PCAiVGhyZWFkOiAgIiA8PCAoMCAtIGkpIDw8ICJcbiI7CiAgICB9CiAgICAKICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtdSk7CiAgICBmaW5pc2hlZCA9IHRydWU7CiAgICBjdi5ub3RpZnlfb25lKCk7Cn0KCmludCBtYWluKCkKewoJewogICAgCXN0ZDo6dGhyZWFkIHQxKHRocmVhZEZ1bmMpOwogICAgCXQxLmRldGFjaCgpOyAvLyBDYWxsIGBkZXRhY2hgIHRvIHByZXZlbnQgYmxvY2tpbmcgdGhpcyB0aHJlYWQKICAgIAkKCX0gLy8gTmVlZCB0byBjYWxsIGBqb2luYCBvciBgZGV0YWNoYCBiZWZvcmUgYHRocmVhZGAgZ29lcyBvdXQgb2Ygc2NvcGUKCiAgICBmb3IgKGludCBpID0gMDsgaSA8IDU7ICsraSkKICAgIHsKICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobXUpOwogICAgICAgIHN0ZDo6Y291dCA8PCAiTWFpbjogICIgPDwgaSA8PCAiXG4iOwogICAgfQoKICAgIHN0ZDo6Y291dCA8PCAiRW5kIG9mIE1haW5cbiI7CiAgICAKICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtdSk7CiAgICBjdi53YWl0KGxvY2ssIFsmZmluaXNoZWRdKCkgeyByZXR1cm4gZmluaXNoZWQ7IH0pOwogICAgCiAgICByZXR1cm4gMDsKfQ==