短いバージョン: 同期ラッパー wrap を作成し、std::cout
同期を使用しcout
て書き込みます。
長いバージョン:
#include <mutex>
template<typename T>
struct Synchronized {
explicit Synchronized(T& t_):t(t_) {}
template<typename Functor>
auto operator()( Functor&& f ) const->decltype(f(t)) {
std::lock_guard<std::mutex> guard(myMutex);
return f(t);
}
// I could implement these, but I'm lazy:
Synchronized& operator=(Synchronized const&) = delete;
Synchronized& operator=(Synchronized &&) = delete;
Synchronized(Synchronized const&) = delete;
Synchronized(Synchronized &&) = delete;
private:
mutable T& t;
mutable std::mutex myMutex;
};
// in "sync_cout.h"
extern Synchronized<std::ostream> sync_cout;
// in "sync_cout.cpp"
Synchronized<std::ostream> sync_cout(std::cout);
// In "logger.h"
// #include "sync_cout.h"
class Logger {
public:
void log(string& msg){
sync_cout( [&](std::ostream& os) {
os << "[" << tag << "] " << msg;
});
}
private:
string tag;
};
( Herbから盗まれました。上記の誤りはすべて私自身のものであり、Herb のものではありません。)
優れたパフォーマンスを得るために、上記のリンクにはノンブロッキングの非同期ラッパーも含まれています。