我有一个多线程应用程序,它大量使用 std::cout 进行日志记录而没有任何锁定.在这种情况下,如何轻松添加锁机制使 std::cout 成为线程安全的?
I have a multi-threaded application, which heavily uses std::cout for logging without any locking. In such a case, how can I easily add lock mechanism to make std::cout thread-safe?
我不想搜索每次出现的 std::cout 并添加一行锁定代码.太麻烦了.
I don't want to search for each occurrence of std::cout and add a line of locking code. That is too tedious.
有什么更好的做法吗?
注意:这个答案是 pre-C++20 所以它不使用 std::osyncstream 具有单独的缓冲,但使用锁代替.
我猜您可以实现自己的类,该类包装 cout 并将互斥体与其关联.那个新类的 operator << 会做三件事:
I guess you could implement your own class which wraps cout and associates a mutex with it. The operator << of that new class would do three things:
<<<< for the wrapped stream and the passed argument这个不同的类将把锁和委托操作符 << 保留到包装的流中.第二个类的析构函数最终会破坏锁并释放互斥锁.
This different class would keep the lock and delegate operator << to the wrapped stream. The destructor of that second class would eventually destroy the lock and release the mutex.
因此,您作为单个语句编写的任何输出,即作为 << 调用的单个序列,只要您的所有输出通过具有相同互斥量的对象,就会自动打印.
So any output you write as a single statement, i.e. as a single sequence of << invocations, will be printed atomically as long as all your output goes through that object with the same mutex.
让我们调用两个类 synchronized_ostream 和 locked_ostream.如果 sync_cout 是 synchronized_ostream 的一个实例,它包装了 std::cout,那么序列
Let's call the two classes synchronized_ostream and locked_ostream. If sync_cout is an instance of synchronized_ostream which wraps std::cout, then the sequence
sync_cout << "Hello, " << name << "!" << std::endl;
将导致以下操作:
synchronized_ostream::operator<<< 会获得锁synchronized_ostream::operator<< 会将Hello,"的打印委托给 coutoperator<<(std::ostream&, const char*) 将打印Hello,"synchronized_ostream::operator<< 会构造一个 locked_ostream 并将锁传递给那个locked_ostream::operator<< 会将name 的打印委托给coutoperator<<(std::ostream&, std::string) 将打印名称cout 发生在感叹号和结束线操纵器locked_ostream 临时被破坏,锁被释放synchronized_ostream::operator<< would aquire the locksynchronized_ostream::operator<< would delegate the printing of "Hello, " to coutoperator<<(std::ostream&, const char*) would print "Hello, "synchronized_ostream::operator<< would construct a locked_ostream and pass the lock to thatlocked_ostream::operator<< would delegate the printing of name to coutoperator<<(std::ostream&, std::string) would print the namecout happens for the exclamation point and the endline manipulatorlocked_ostream temporary gets destructed, the lock is released这篇关于如何轻松使 std::cout 线程安全?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持html5模板网!
fpermissive 标志有什么作用?What does the fpermissive flag do?(fpermissive 标志有什么作用?)
如何在我不想编辑的第 3 方代码中禁用来自 gccHow do you disable the unused variable warnings coming out of gcc in 3rd party code I do not wish to edit?(如何在我不想编辑的第 3 方代码中禁
使用 GCC 预编译头文件Precompiled headers with GCC(使用 GCC 预编译头文件)
如何在 OS X 中包含 omp.h?How to include omp.h in OS X?(如何在 OS X 中包含 omp.h?)
如何让 GCC 将 .text 部分编译为可写在 ELF 二进制文How can I make GCC compile the .text section as writable in an ELF binary?(如何让 GCC 将 .text 部分编译为可写在 ELF 二进制文件中?)
GCC、字符串化和内联 GLSL?GCC, stringification, and inline GLSL?(GCC、字符串化和内联 GLSL?)