首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >并发cout格式

并发cout格式
EN

Stack Overflow用户
提问于 2017-09-29 08:19:56
回答 1查看 142关注 0票数 2

这是一个学术问题。

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-29 08:58:16

我使用boost来简化,但是您可以编写自己的可选和状态保护程序。

代码语言:javascript
复制
#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 <<的计算顺序从左到右。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46484652

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档