并发cout格式

时间:2017-09-29 08:19:56

标签: c++ multithreading c++14 stdout

这是一个学术问题。

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吗?

1 个答案:

答案 0 :(得分:2)

我为了简洁而使用了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 <<的评估顺序是从左到右。

相关问题