#include <thread>
#include <iostream>
#include <vector>
#include <mutex>
#include <list>
class Hello
{
int i_;
static std::mutex mu_;
public:
Hello()
{
std::lock_guard<std::mutex> lock(mu_);
i_ = 0;
}
~Hello()
{
}
void say_hello()
{
std::lock_guard<std::mutex> lock(mu_);
std::cout << "say_hello from thread " << ++i_ << " " << this << " " << std::this_thread::get_id() << std::endl;
}
};
std::mutex Hello::mu_;
void hellos_in_threads_stack()
{
std::vector<std::thread> threads;
for (int i = 0; i < 4; ++i)
{
threads.emplace_back([]() {
Hello h;
h.say_hello();
});
}
for (auto& thread : threads) {
thread.join();
}
}
void hellos_in_list()
{
std::vector<std::thread> threads;
std::list<Hello> hellos;
for (int i = 0; i < 4; ++i)
{
hellos.emplace_back();
threads.emplace_back(&Hello::say_hello, &hellos.back());
}
for (auto& thread : threads) {
thread.join();
}
}
int main()
{
hellos_in_threads_stack();
hellos_in_list();
}
I2luY2x1ZGUgPHRocmVhZD4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8bXV0ZXg+CiNpbmNsdWRlIDxsaXN0PgoKY2xhc3MgSGVsbG8KewoJaW50IGlfOwoJc3RhdGljIHN0ZDo6bXV0ZXggbXVfOwpwdWJsaWM6CglIZWxsbygpCgl7CgkJc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobXVfKTsKCQlpXyA9IDA7Cgl9CgoJfkhlbGxvKCkKCXsKCX0KCgl2b2lkIHNheV9oZWxsbygpCgl7CgkJc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobXVfKTsKCQlzdGQ6OmNvdXQgPDwgInNheV9oZWxsbyBmcm9tIHRocmVhZCAiIDw8ICsraV8gPDwgIiAiIDw8IHRoaXMgPDwgIiAiIDw8IHN0ZDo6dGhpc190aHJlYWQ6OmdldF9pZCgpIDw8IHN0ZDo6ZW5kbDsKCX0KfTsKCnN0ZDo6bXV0ZXggSGVsbG86Om11XzsKCnZvaWQgaGVsbG9zX2luX3RocmVhZHNfc3RhY2soKQp7CglzdGQ6OnZlY3RvcjxzdGQ6OnRocmVhZD4gdGhyZWFkczsKCWZvciAoaW50IGkgPSAwOyBpIDwgNDsgKytpKQoJewoJCXRocmVhZHMuZW1wbGFjZV9iYWNrKFtdKCkgewoJCQlIZWxsbyBoOwoJCQloLnNheV9oZWxsbygpOwoJCX0pOwoJfQoKCWZvciAoYXV0byYgdGhyZWFkIDogdGhyZWFkcykgewoJCXRocmVhZC5qb2luKCk7Cgl9Cn0KCgp2b2lkIGhlbGxvc19pbl9saXN0KCkKewoJc3RkOjp2ZWN0b3I8c3RkOjp0aHJlYWQ+IHRocmVhZHM7CglzdGQ6Omxpc3Q8SGVsbG8+IGhlbGxvczsKCWZvciAoaW50IGkgPSAwOyBpIDwgNDsgKytpKQoJewoJCWhlbGxvcy5lbXBsYWNlX2JhY2soKTsKCQl0aHJlYWRzLmVtcGxhY2VfYmFjaygmSGVsbG86OnNheV9oZWxsbywgJmhlbGxvcy5iYWNrKCkpOwoJfQoKCWZvciAoYXV0byYgdGhyZWFkIDogdGhyZWFkcykgewoJCXRocmVhZC5qb2luKCk7Cgl9Cn0KCmludCBtYWluKCkKewoJaGVsbG9zX2luX3RocmVhZHNfc3RhY2soKTsKCWhlbGxvc19pbl9saXN0KCk7Cn0=