#include <streambuf>
#include <ios>
#include <thread>
#include <sstream>
class seppjs_thread_logger_streambuf : public std::streambuf
{
public:
seppjs_thread_logger_streambuf(std::ios& in) : in(in), buf (in.rdbuf()), newline(true)
{
in.rdbuf(this);
}
~seppjs_thread_logger_streambuf()
{
in.rdbuf(buf);
}
seppjs_thread_logger_streambuf(const seppjs_thread_logger_streambuf&) = delete;
seppjs_thread_logger_streambuf& operator=(const seppjs_thread_logger_streambuf&) = delete;
private:
std::ios& in;
std::streambuf* buf;
bool newline;
protected:
virtual int_type overflow(int_type c)
{
if(newline)
{
std::stringstream message;
message << "Task " << std::this_thread::get_id() << ": ";
buf->sputn(message.str().data(), message.str().size());
newline = false;
}
if (traits_type::eq_int_type(c, traits_type::to_int_type('\n')))
newline = true;
buf->sputc(c);
return c;
}
};
// Beispielanwendung
#include <iostream>
void function()
{
std::cout << "Blah\nBlupp\nBäh\n";
}
int main()
{
seppjs_thread_logger_streambuf foo(std::cout);
std::thread t1(function), t2(function);
t1.join();
t2.join();
}
I2luY2x1ZGUgPHN0cmVhbWJ1Zj4KI2luY2x1ZGUgPGlvcz4gICAgCiNpbmNsdWRlIDx0aHJlYWQ+CiNpbmNsdWRlIDxzc3RyZWFtPgoKY2xhc3Mgc2VwcGpzX3RocmVhZF9sb2dnZXJfc3RyZWFtYnVmIDogcHVibGljIHN0ZDo6c3RyZWFtYnVmCnsKcHVibGljOgogIHNlcHBqc190aHJlYWRfbG9nZ2VyX3N0cmVhbWJ1ZihzdGQ6OmlvcyYgaW4pIDogaW4oaW4pLCBidWYgKGluLnJkYnVmKCkpLCBuZXdsaW5lKHRydWUpCiAgewogICAgaW4ucmRidWYodGhpcyk7CiAgfQogIH5zZXBwanNfdGhyZWFkX2xvZ2dlcl9zdHJlYW1idWYoKQogIHsKICAgIGluLnJkYnVmKGJ1Zik7CiAgfQogIHNlcHBqc190aHJlYWRfbG9nZ2VyX3N0cmVhbWJ1Zihjb25zdCBzZXBwanNfdGhyZWFkX2xvZ2dlcl9zdHJlYW1idWYmKSA9IGRlbGV0ZTsKICBzZXBwanNfdGhyZWFkX2xvZ2dlcl9zdHJlYW1idWYmIG9wZXJhdG9yPShjb25zdCBzZXBwanNfdGhyZWFkX2xvZ2dlcl9zdHJlYW1idWYmKSA9IGRlbGV0ZTsKCnByaXZhdGU6CiAgc3RkOjppb3MmIGluOwogIHN0ZDo6c3RyZWFtYnVmKiBidWY7CiAgYm9vbCBuZXdsaW5lOwpwcm90ZWN0ZWQ6CiAgdmlydHVhbCBpbnRfdHlwZSBvdmVyZmxvdyhpbnRfdHlwZSBjKQogIHsKICAgIGlmKG5ld2xpbmUpCiAgICAgIHsKICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBtZXNzYWdlOwogICAgICAgIG1lc3NhZ2UgPDwgIlRhc2sgIiA8PCBzdGQ6OnRoaXNfdGhyZWFkOjpnZXRfaWQoKSA8PCAiOiAiOwogICAgICAgIGJ1Zi0+c3B1dG4obWVzc2FnZS5zdHIoKS5kYXRhKCksIG1lc3NhZ2Uuc3RyKCkuc2l6ZSgpKTsKICAgICAgICBuZXdsaW5lID0gZmFsc2U7CiAgICAgIH0KICAgIGlmICh0cmFpdHNfdHlwZTo6ZXFfaW50X3R5cGUoYywgdHJhaXRzX3R5cGU6OnRvX2ludF90eXBlKCdcbicpKSkKICAgICAgbmV3bGluZSA9IHRydWU7CiAgICBidWYtPnNwdXRjKGMpOwogICAgcmV0dXJuIGM7ICAKICB9Cn07CgoKLy8gQmVpc3BpZWxhbndlbmR1bmcKI2luY2x1ZGUgPGlvc3RyZWFtPgoKdm9pZCBmdW5jdGlvbigpCnsKICBzdGQ6OmNvdXQgPDwgIkJsYWhcbkJsdXBwXG5Cw6RoXG4iOyAgCn0KCmludCBtYWluKCkKewogIHNlcHBqc190aHJlYWRfbG9nZ2VyX3N0cmVhbWJ1ZiBmb28oc3RkOjpjb3V0KTsKICBzdGQ6OnRocmVhZCB0MShmdW5jdGlvbiksIHQyKGZ1bmN0aW9uKTsKICAKICB0MS5qb2luKCk7CiAgdDIuam9pbigpOwp9Cg==