两个ofstream多线程写同一个文件

youngwolf 2015-02-15 10:19:02
两个线程代码完全一样:
ofstream file;
file.open(dest_file.data(), ios::out | ios::binary | ios::app);

file.write(buff, size);

未加任何互斥。
现在的问题是,有时写出来的东西会丢掉部分内容,不知道这些内容是在buff里面就掉了(那就是我的逻辑问题),或者是因为我这样多线程使用ofstream有问题,所以我想请问一下,我这样用ofstream有没有问题?
...全文
1857 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
jayvslz 2016-08-08
  • 打赏
  • 举报
回复
引用 10 楼 yang79tao 的回复:
没错,只一个ofstream,然后加锁应该没问题。 我的问题是:我上面的代码是不是肯定有问题,而且这个问题是造成我的问题(有时写出来的东西会丢掉部分内容)的原因? 我是想先定位问题,根据我分析,我的问题有两种可能: 1. 多线程使用ofstream有问题; 2. 我在调用ofstream::write之前,buffer里面的东西已部分丢失; 这两个问题会造成我完全从两个方面去查找问题,所以如果能先确定是哪一个问题,能节省好多时间。
我现在也遇到了跟你一样的问题,我没用CFile写文件,用的也是ofstream写文件,编译通过,调试的时候报错了... 代码如下: long lOpenPrice = 0l; lOpenPrice = GetDlgItemInt(IDC_EDIT_OPEN); file.write((char*)lOpenPrice, 4); //调试到这里的时候报错 我被卡到这里已经卡了很长时间了,真急四了......
o桑相o 2015-05-22
  • 打赏
  • 举报
回复
建议你重新设计一下log系统的结构,假设是以文件的形式来保存log,第一要注意的是log日志文件必须碎片化,某个时间段来命名,不能让单个文件很大,读写同一文件必须独占模式,因为文件已经碎片化了,所以访问同一文件的的请求不是很多,也不会造成cpu时间浪费,第二个想说的是为啥不用开源的现成的log日志系统?
encoderlee 版主 2015-02-15
  • 打赏
  • 举报
回复
整个进程只创建一个ofstream file; 打开文件后不要关闭,多线程互斥着file.write 这样文件只有一个,缓冲区只有一个,flush还是不flush都不会乱
lougd 2015-02-15
  • 打赏
  • 举报
回复
可以把ofstream作为全局变量然后在调用ofstream::write的时候加锁,或者搞一个缓冲区多个线程里往这个缓冲区里写数据,一个线程将缓冲区的数据写到文件里。
youngwolf 2015-02-15
  • 打赏
  • 举报
回复
引用 3 楼 mymtom 的回复:
这种情况建议加锁
我感觉加了锁也不行,因为ofstream是一个临时变量,除非把两个线程里面的ofstream拿出来做成全局变量。 如果非要回销,我感觉只能对ofstream::write加锁,但write看起来像是写入了ofstream的buffer,当这两个buffer真正flush到磁盘的时候,该乱的还是要乱。如果对flush加锁也不行,因为当ofstream的buffer满了的时候,会自动flush。
youngwolf 2015-02-15
  • 打赏
  • 举报
回复
引用 4 楼 SiGoYi 的回复:
不加互斥,多个线程写一个文件有什么意义啊?除非文件的内容是不要求顺序的。但仔细想想即使不要求顺序,这样做也是没有意义的,多个线程写一个文件我感觉楼主的目的就是为了性能,但除非你的计算机核非常多,要不使用多线程和单线程写文件的性能都是差不多的。 以上是建议,另外,感觉楼主的问题应该是写文件造成的,我感觉buff里的数据应该不会丢。
多线程写文件只是为了方便,至少在我这里不是为了效率。 典型的用法就是写log,如果你没有一个log系统,那么写log这个操作会集成在代码的各个地方,一般的做法是,直接写log,每次都打开文件,写文件,关闭文件。 我这个需求跟写log非常相似,既顺序的确是无关的,但必须保证每次写入的完整性,因为它是以行为单位的,要求每一行完整,但行与行之间不需要什么顺序。
lougd 2015-02-15
  • 打赏
  • 举报
回复
多线程的访问文件的话要加锁。
SiGoYi 2015-02-15
  • 打赏
  • 举报
回复
不加互斥,多个线程写一个文件有什么意义啊?除非文件的内容是不要求顺序的。但仔细想想即使不要求顺序,这样做也是没有意义的,多个线程写一个文件我感觉楼主的目的就是为了性能,但除非你的计算机核非常多,要不使用多线程和单线程写文件的性能都是差不多的。 以上是建议,另外,感觉楼主的问题应该是写文件造成的,我感觉buff里的数据应该不会丢。
mymtom 2015-02-15
  • 打赏
  • 举报
回复
这种情况建议加锁
encoderlee 版主 2015-02-15
  • 打赏
  • 举报
回复
加锁访问试试,看看还会不会丢数据。
youngwolf 2015-02-15
  • 打赏
  • 举报
回复
linux系统。
youngwolf 2015-02-15
  • 打赏
  • 举报
回复
我之所以这样写代码(多线程append模式i不加锁写同一个文件),还有一个原因就是,我们真实的log系统,就是这样做的,也没有出过什么问题,跟我唯一的区别是,我用的是ofstream,log系统用的是api: int fd = open(file, O_WRONLY | O_CREAT | O_APPEND, 00644); write(fd, buffer, strlen(buffer)); 我想这唯一的解释就是(如果我在write之前写buffer的代码没有问题的话),ofstream多了一层自己的buffer。 可是让问题变得越来越复杂的是,我们的另一个产品的log系统,用的是ofstream并且没有加锁,据说没出过问题。
youngwolf 2015-02-15
  • 打赏
  • 举报
回复
没错,只一个ofstream,然后加锁应该没问题。 我的问题是:我上面的代码是不是肯定有问题,而且这个问题是造成我的问题(有时写出来的东西会丢掉部分内容)的原因? 我是想先定位问题,根据我分析,我的问题有两种可能: 1. 多线程使用ofstream有问题; 2. 我在调用ofstream::write之前,buffer里面的东西已部分丢失; 这两个问题会造成我完全从两个方面去查找问题,所以如果能先确定是哪一个问题,能节省好多时间。

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧