你的代码很浪费,不遵循C++习惯用法。

从结尾开始:是的,write是线程安全的,因为win32 CRITICAL_SECTION可以保护它免受并发修改。

虽然:

为什么打开,每次关闭流?这是非常浪费的事情。在构造函数中打开流并将其打开。析构函数将处理关闭流。

如果你想使用Win32临界区,至少使其RAII安全。创建一个包含对临界区的引用的类,将其锁定在构造函数中并在析构函数中解锁它。这种方式,即使抛出异常 - 你保证锁将被解锁。

无论如何,CriticalSection的减速度在哪里?它应该是Log的成员。你知道吗std::mutex?

你为什么按价值传递字符串?这是非常无效的。然后通过const引用传递。

您对一些变量(file_path)使用snake_case,而对其他变量使用snake_case(CriticalSection)。使用相同的约定。

str从来都不是一个字符串变量的好名字,并且文件流不是日志。是真正的日志记录的事情。 logger是一个更好的名字。在我的更正中,只是将其命名为m_file_stream。

更正代码:

class Log

{

private:

std::mutex m_lock;

std::ofstream m_file_stream;

std::string m_file_path;

public:

Log(const std::string& file_path);

void write(const std::string& log);

};

Log::Log(const std::string& file_path):

m_file_path(file_path)

{

m_file_stream.open(m_file_path.c_str());

if (!m_file_stream.is_open() || !m_file_stream.good())

{

//throw relevant exception.

}

}

void Log::write(const std::string& log)

{

std::lock_guard<:mutex> lock(m_lock);

m_file_stream << log << '\n';

}

c++语言中如何写入文件,C++:在多线程程序中写入文件相关推荐

  1. C语言编程>第二十三周 ③ 下列给定程序中,函数fun的功能是:利用插入排序法对字符串中的字符按从小到大的顺序进行排序。插入法的基本算法是:先对字符串中的头两个元素进行排序;然后把第三字符插入

    例题:下列给定程序中,函数fun的功能是:利用插入排序法对字符串中的字符按从小到大的顺序进行排序.插入法的基本算法是:先对字符串中的头两个元素进行排序:然后把第三字符插入到前两个字符中,插入后前三个字 ...

  2. C语言编程>第二十周 ② 下列给定程序中,函数fun的功能是:求出数组中最大数和次最大数,并把最大数和b[0]中的数对调、次最大数和b[1]中的数对调。

    例题:下列给定程序中,函数fun的功能是:求出数组中最大数和次最大数,并把最大数和b[0]中的数对调.次最大数和b[1]中的数对调. 注意:不要改动main函数,不能增行或删行,也不能更改程序的结构. ...

  3. C语言编程>第二十五周 ① 给定程序中,函数fun的功能是:在形参s所指字符串中的每个非数字字符之后插入一个“*”号。

    例题:给定程序中,函数fun的功能是:在形参s所指字符串中的每个非数字字符之后插入一个"*"号. 例如,形参s所指的字符串为:albc45sdtg56f,则执行结果为:a*1b*c ...

  4. C语言编程>第十八周 ⑧ 给定程序中,函数fun的功能是:将形参指针所指结构体数组中的三个元素按num成员进行升序排列。

    例题:给定程序中,函数fun的功能是:将形参指针所指结构体数组中的三个元素按num成员进行升序排列. 注意:请勿改动主函数main与其他函数中的任何内容,仅在横线上填写所需的若干表达式或语句. 代码如 ...

  5. C语言编程>第二十五周 ② 下列程序中,函数fun的功能是:将大写字母转换为对应小写字母之后的第五个字母,若为小写字母为v~z,使小写字母的值减21,转换后的小写字母作为函数值返回。

    例题:下列程序中,函数fun的功能是:将大写字母转换为对应小写字母之后的第五个字母,若为小写字母为v-z,使小写字母的值减21,转换后的小写字母作为函数值返回. 例如,若形参是字母A,则转换为小写字母 ...

  6. 多线程程序中操作的原子性--转帖

    多线程程序中操作的原子性 0. 背景 原子操作就是不可再分的操作.在多线程程序中原子操作是一个非常重要的概念,它常常用来实现一些同步机制,同时也是一些常见的多线程Bug的源头.本文主要讨论了三个问题: ...

  7. 多线程程序中操作的原子性

    0. 背景 原子操作就是不可再分的操作.在多线程程序中原子操作是一个非常重要的概念,它常常用来实现一些同步机制,同时也是一些常见的多线程Bug的源头. 本文主要讨论了三个问题: 1. 多线程程序中对变 ...

  8. exists 实现查看表Activity中FmyId=1(具体数字在程序中动态给定)的好友发起的活动

    一个数据库tb 两个表:FriendTable  Activity 其中 FriendTable : 内容 Activity: 内容: 实现查看表Activity中FmyId=1(具体数字在程序中动态 ...

  9. 多线程编译与运行linux,Linux系统下多线程程序编译makefile文件

    在Linux下,编译一个多线程的程序命令为: gcc -lpthread -o file file.c 在Linux下,用交叉编译器编译一个在uclinux下运行的多线程程序,makefile文件如下 ...

  10. ip地址转换数字函数 iton_c# – RabbitMQ CreateConneciton问题 – 在一个应用程序中运行,但在另一个应用程序中运行...

    所以这是连接代码. var factory = new ConnectionFactory { HostName = "myserver", UserName = "te ...

最新文章

  1. 港中大、商汤开源目标检测工具包mmdetection,对比Detectron如何?
  2. c语言的非法字符常量,判断C语言数值常量是否合法?为什么不合法?
  3. 线程池之工作项,等待项,计时项 (存在疑问???)
  4. 复现经典:《统计学习方法》第 7 章 支持向量机
  5. 三十九、@staticmethod、@classmethod和@property类装饰器
  6. 全端开发——html简介与常用标签
  7. [Noi2016]区间
  8. db2 设置表 not null
  9. java项目学习_一个Java项目的学习
  10. 软件测试,何去何从?想安逸不可能!软饭得硬吃...我整理的超全学习指南【值得每个测试一看】
  11. java解析ceb文件_什么是Java的平台无关性
  12. 一道不知道哪里来的容斥题
  13. 主流PLC解密软件,西门子smart,200 松下PLC欧姆龙三菱解密
  14. 汽车功能安全标准“ISO 26262”导入实践(上)
  15. ps快捷键大法(最全)
  16. Linux的du命令
  17. SEEDLAB2.0-Meltdown
  18. blob写法的浏览器兼容性
  19. linux c语言 写文件,linux c通过文件描述符以及write和read方法对文件进行读写
  20. 不自量力是个恶毒的形容词,但这种心态是最不应该被嘲笑的

热门文章

  1. postgresql数据库的数据导出
  2. 医疗信息化、医学相关资料下载
  3. 【Based Android】Android Sensor感应器介绍(二)线程中刷新UI 创建一个android测力计...
  4. 黄聪:SQL server 2005高可用性之----数据库镜像
  5. PostgresSQL生成UUID
  6. Scala的异常处理
  7. Linux脚本传递参数
  8. matplotlib画图中文显示
  9. 使用卷积神经网络进行文本分类textCNN
  10. 2019腾讯后台开发暑期实习面经汇总