并发cout格式

Concurrent cout formatting

本文关键字:格式 cout 并发      更新时间:2023-10-16

这是一个学术问题。

sdt::mutex m;
typedef std::lock_guard<std::mutex> G;
void thread1(){
  G g(m);       
  std::cout << std::setw(9);
  std::cout << 3.14;
  std::cout << std::endl;
}
void thread2(){
  G g(m);       
  std::cout << std::setw(7);
  std::cout << 3.14;
  std::cout << std::endl;
}

我的问题是格式绑定到输出流,因此,如果我想确定产生的输出,我需要设置线程上发明的所有格式选项。明年将有或不会工作。

  • 是否有任何方法可以将格式重置为默认值,而无需手动设置所有内容?
  • 如果没有,什么是好的解决方法?
    • 例如,我应该在线程上创建并保留std::ostringstream并将oss.str()写入std::cout

我已经为简洁地使用了boost,但您可以编写自己的可选和州储蓄者。

#include <mutex>
#include <iostream>
#include <iomanip>
#include <tuple>
#include <utility>
#include <boost/io/ios_state.hpp>
#include <boost/optional.hpp>
std::mutex m;
struct save_and_lock
{
    boost::optional<boost::io::ios_all_saver> saver;
    std::unique_lock<std::mutex> lock;
    void init(std::ostream& os)
    {
        lock = std::unique_lock<std::mutex>(m);
        saver.emplace(os);
        os.flags(std::ios_base::fmtflags(0));
    }
    friend std::ostream& operator<<(std::ostream& os, save_and_lock&& s)
    {
        s.init(os);
        return os;
    }
};
void thread1(){
    std::cout << save_and_lock() << std::setw(9) << 3.14 << std::endl;
}
void thread2(){
    std::cout << save_and_lock() << std::setw(9) << 3.14 << std::endl;
}

这将起作用,因为用户定义的operator <<的评估顺序是向右。