【发布时间】:2016-07-26 03:53:30
【问题描述】:
我需要在我的日志记录应用程序中锁定标准输出,以防止多线程应用程序中的字符串交错记录到标准输出。无法弄清楚如何使用移动构造函数或 std::move 或其他东西将 unique_lock 移动到另一个对象。
我创建了用于设置配置和封装的对象,并想出了如何使用静态 std::mutex 锁定标准输出以锁定这些对象(称为分片)。
这样的东西对我有用:
l->log(1, "Test message 1");
虽然这很好并且可以使用模板和可变数量的参数来实现,但我想接近更多类似流的可能性。我正在寻找这样的东西:
*l << "Module id: " << 42 << "value: " << 42 << std::endl;
我不想强迫用户预先计算带有连接和 to_string(42) 的字符串,我只想找到一种锁定标准输出的方法。
到目前为止,我的方法是创建运算符
locked_stream& shard::operator<<(int num)
{
static std::mutex _out_mutex;
std::unique_lock<std::mutex> lock(_out_mutex);
//std::lock_guard<std::mutex> lock (_out_mutex);
std::cout << std::to_string(num) << "(s)";
locked_stream s;
return s;
}
将输入输出到 std::cout 后,我想将锁移到对象流中。
【问题讨论】:
-
不确定评论是否会受到赞赏,但在这种情况下我会做的是将日志记录卸载到另一个线程。日志线程将在没有任何锁的情况下写入标准输出,而其他线程可以通过无锁队列发送消息。更少的争用和更高的吞吐量,并且不需要通过流操作编织锁。无论如何我都会添加答案。
-
我很感激!我将尝试合并您的答案和现有代码,但会牢记您的建议!以后还不如试着改写。
标签: multithreading c++11 logging stdout mutex