#include <iostream>
#include <atomic>
#include <mutex>
#include <thread>
#include <vector>
std::mutex cout_mutex;//std::cout is not natively synchronized.
class Tracker{
public:
int get(){
return ++counter;
}
Tracker():counter(0){}
~Tracker(){
std::lock_guard<std::mutex> guard{cout_mutex};
std::cout<<"~Tracker()"<<std::this_thread::get_id()<<std::endl;
}
private:
std::atomic<int> counter;
};
std::atomic<bool> stop_flag;
std::vector<std::thread> threads;
Tracker tracker;
void chug(size_t index){
while(!stop_flag){
{
std::lock_guard<std::mutex> guard{cout_mutex};
std::cout<<index<<" : "<<tracker.get()<<std::endl;
}
std::this_thread::sleep_for(std::chrono::milliseconds(10));//slow it down!
}
}
//stop_all brings all the threads to a safe and known conclusion.
void stop_all(){
stop_flag=true;
for( auto& curr: threads){
curr.join();
}
}
void detach_all(){
for( auto& curr: threads){
curr.detach();
}
}
int main() {
const size_t num{10};
std::cout << "main(): "<<std::this_thread::get_id()<<'\n';
for(size_t i=0;i<num;++i){
threads.emplace_back(chug,i);
}
std::this_thread::sleep_for(std::chrono::milliseconds(100));//Let it run!
detach_all();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgogICAgI2luY2x1ZGUgPGF0b21pYz4KICAgICNpbmNsdWRlIDxtdXRleD4KICAgICNpbmNsdWRlIDx0aHJlYWQ+CiAgICAjaW5jbHVkZSA8dmVjdG9yPgoKICAgIHN0ZDo6bXV0ZXggY291dF9tdXRleDsvL3N0ZDo6Y291dCBpcyBub3QgbmF0aXZlbHkgc3luY2hyb25pemVkLgogICAgCiAgICBjbGFzcyBUcmFja2VyewogICAgICAgIHB1YmxpYzoJCiAgICAJaW50IGdldCgpewogICAgCQlyZXR1cm4gKytjb3VudGVyOwogICAgCX0KICAgIAkKICAgIAlUcmFja2VyKCk6Y291bnRlcigwKXt9CiAgICAJflRyYWNrZXIoKXsKICAgIAkJc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGd1YXJke2NvdXRfbXV0ZXh9OwogICAgCQlzdGQ6OmNvdXQ8PCJ+VHJhY2tlcigpIjw8c3RkOjp0aGlzX3RocmVhZDo6Z2V0X2lkKCk8PHN0ZDo6ZW5kbDsKICAgIAl9CiAgICAJCiAgICAJcHJpdmF0ZToKICAgIAkgICAgc3RkOjphdG9taWM8aW50PiBjb3VudGVyOwogICAgfTsKICAgIAogICAgCiAgICBzdGQ6OmF0b21pYzxib29sPiBzdG9wX2ZsYWc7CiAgICBzdGQ6OnZlY3RvcjxzdGQ6OnRocmVhZD4gdGhyZWFkczsKICAgIAogICAgVHJhY2tlciB0cmFja2VyOwogICAgCiAgICB2b2lkIGNodWcoc2l6ZV90IGluZGV4KXsKICAgIAl3aGlsZSghc3RvcF9mbGFnKXsKICAgIAkJewogICAgCQkJc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGd1YXJke2NvdXRfbXV0ZXh9OwogICAgCQkJc3RkOjpjb3V0PDxpbmRleDw8IiA6ICI8PHRyYWNrZXIuZ2V0KCk8PHN0ZDo6ZW5kbDsKICAgIAkJfQogICAgCSAgICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3Ioc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcygxMCkpOy8vc2xvdyBpdCBkb3duIQogICAgCX0KICAgIH0KICAgIAoKICAgIC8vc3RvcF9hbGwgYnJpbmdzIGFsbCB0aGUgdGhyZWFkcyB0byBhIHNhZmUgYW5kIGtub3duIGNvbmNsdXNpb24uCiAgICB2b2lkIHN0b3BfYWxsKCl7CiAgICAJc3RvcF9mbGFnPXRydWU7CiAgICAJZm9yKCBhdXRvJiBjdXJyOiB0aHJlYWRzKXsKICAgIAkJY3Vyci5qb2luKCk7CiAgICAJfQogICAgfQogICAgCiAgICB2b2lkIGRldGFjaF9hbGwoKXsKICAgIAlmb3IoIGF1dG8mIGN1cnI6IHRocmVhZHMpewogICAgCQljdXJyLmRldGFjaCgpOwogICAgCX0KICAgIH0KICAgIAogICAgCiAgICBpbnQgbWFpbigpIHsKICAgIAljb25zdCBzaXplX3QgbnVtezEwfTsKICAgIAoJc3RkOjpjb3V0IDw8ICJtYWluKCk6ICI8PHN0ZDo6dGhpc190aHJlYWQ6OmdldF9pZCgpPDwnXG4nOyAgICAKICAgIAogICAgCWZvcihzaXplX3QgaT0wO2k8bnVtOysraSl7CiAgICAJCXRocmVhZHMuZW1wbGFjZV9iYWNrKGNodWcsaSk7CiAgICAJfQogICAgCQogICAgCXN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2ZvcihzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDEwMCkpOy8vTGV0IGl0IHJ1biEKICAgIAogICAgICAgICAgICBkZXRhY2hfYWxsKCk7CiAgICAKICAgIAlyZXR1cm4gMDsKICAgIH0KCg==