并发cout格式
Concurrent cout formatting
这是一个学术问题。
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 <<
的评估顺序是向右。
相关文章:
- 如何在openssl-ecc中获取十六进制格式的私钥
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 将"打开的CV图像"中的"颜色"转换为整数格式
- 0x%08lx 格式说明符在 printf 语句到 cout
- 在 c++ 中以十六进制格式打印无符号字符(BYTE).使用 std::cout
- 了解 C++ 中的 cout 格式
- 如何理解cout的默认格式
- 输出使用 cout 转换为 ASCII 的文本时输出格式不正确,C++
- 在CPP的COUT中等效的printf格式
- 并发cout格式
- 从printf-复杂格式指定符模式切换到cout
- C++具有 std::cout 格式的可变数量的参数
- 为什么我们不将格式说明符与 cout 一起使用?
- 正在将cout格式的数据写入printf
- C++ 中的 cout 浮点格式
- 在c++中使用cout以十六进制格式打印OpenCL cl_uchar
- 自动C++ cout <<格式
- 为什么 cout<<hex satement 使其余部分仅以十六进制格式打印
- 在 cout 中将数字十进制格式显示为指数
- 使用 std::cout 时如何模拟 printf 的 %p 格式?