CFile写文件在多线程中怎么使用

张亚成 2014-04-28 04:35:55
最进一个程序上老出问题,就使用CFile类写日志文件看看问题到底出在哪儿了,在单线程程序中使用的时候,文件写的好像是对的(因没有没有发现写日志不合理的地方),在多线程程序中使用CFile写日志时候,发现日志内容断断续续的。少了好多,不知怎么处理。
...全文
260 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
BeanJoy 2014-04-29
  • 打赏
  • 举报
回复
引用 15 楼 zhangyacheng_1 的回复:
[quote=引用 14 楼 BeanJoy 的回复:] [quote=引用 13 楼 zhangyacheng_1 的回复:] [quote=引用 12 楼 BeanJoy 的回复:] 不用多线程的话,就用同步吧。 比如: 写日志函数 { 进入临界区 写日志进文件并刷新 退出临界区 } 用一个简单的临界区就搞定了,多个线程只能有一个线程在临界区中执行代码。
请教一下,使用临界区的时候,会不会导致程序的执行结果出错,比如:多个线程抢占资源的时候,没有抢到临界区的线程只是处于等待状态,还是先干别的事儿等获得临界区时候再写日志,线程间的数据会不会因为临界区而出现异常 ? [/quote] 这个就看你怎么设计了。程序出错、崩溃这些都是程序上的BUG,算你使用临界区的问题,不是临界区本身的问题。 如果使用临界区,没抢到资源就只有等待。若不想等待,可使用事件。[/quote] 刚才我可能没有表达清楚我的意思, 我就是想问问是不是当使用临界区时候,某个线程没有抢到资源的话,她就停在进入临界区这句代码出,后面的代码处于等待状态。直到临界区被她抢到, 再执行进入临界区之后的代码 ????[/quote] 是这个意思。 所以使用临界区会影响效率。如果使用另一个线程来写日志,其他写日志的线程只需将日志信息加入到这个线程中的一列表就可返回了,写日志线程就慢慢写,不影响其他线程。
张亚成 2014-04-29
  • 打赏
  • 举报
回复
引用 14 楼 BeanJoy 的回复:
[quote=引用 13 楼 zhangyacheng_1 的回复:] [quote=引用 12 楼 BeanJoy 的回复:] 不用多线程的话,就用同步吧。 比如: 写日志函数 { 进入临界区 写日志进文件并刷新 退出临界区 } 用一个简单的临界区就搞定了,多个线程只能有一个线程在临界区中执行代码。
请教一下,使用临界区的时候,会不会导致程序的执行结果出错,比如:多个线程抢占资源的时候,没有抢到临界区的线程只是处于等待状态,还是先干别的事儿等获得临界区时候再写日志,线程间的数据会不会因为临界区而出现异常 ? [/quote] 这个就看你怎么设计了。程序出错、崩溃这些都是程序上的BUG,算你使用临界区的问题,不是临界区本身的问题。 如果使用临界区,没抢到资源就只有等待。若不想等待,可使用事件。[/quote] 刚才我可能没有表达清楚我的意思, 我就是想问问是不是当使用临界区时候,某个线程没有抢到资源的话,她就停在进入临界区这句代码出,后面的代码处于等待状态。直到临界区被她抢到, 再执行进入临界区之后的代码 ????
BeanJoy 2014-04-29
  • 打赏
  • 举报
回复
引用 13 楼 zhangyacheng_1 的回复:
[quote=引用 12 楼 BeanJoy 的回复:] 不用多线程的话,就用同步吧。 比如: 写日志函数 { 进入临界区 写日志进文件并刷新 退出临界区 } 用一个简单的临界区就搞定了,多个线程只能有一个线程在临界区中执行代码。
请教一下,使用临界区的时候,会不会导致程序的执行结果出错,比如:多个线程抢占资源的时候,没有抢到临界区的线程只是处于等待状态,还是先干别的事儿等获得临界区时候再写日志,线程间的数据会不会因为临界区而出现异常 ? [/quote] 这个就看你怎么设计了。程序出错、崩溃这些都是程序上的BUG,算你使用临界区的问题,不是临界区本身的问题。 如果使用临界区,没抢到资源就只有等待。若不想等待,可使用事件。
张亚成 2014-04-29
  • 打赏
  • 举报
回复
引用 12 楼 BeanJoy 的回复:
不用多线程的话,就用同步吧。 比如: 写日志函数 { 进入临界区 写日志进文件并刷新 退出临界区 } 用一个简单的临界区就搞定了,多个线程只能有一个线程在临界区中执行代码。
请教一下,使用临界区的时候,会不会导致程序的执行结果出错,比如:多个线程抢占资源的时候,没有抢到临界区的线程只是处于等待状态,还是先干别的事儿等获得临界区时候再写日志,线程间的数据会不会因为临界区而出现异常 ?
BeanJoy 2014-04-29
  • 打赏
  • 举报
回复
不用多线程的话,就用同步吧。 比如: 写日志函数 { 进入临界区 写日志进文件并刷新 退出临界区 } 用一个简单的临界区就搞定了,多个线程只能有一个线程在临界区中执行代码。
张亚成 2014-04-29
  • 打赏
  • 举报
回复
引用 10 楼 gz_qmc 的回复:
内存映射文件 多线程写 各写一段 互不干涉 什么?写的是日志? 什么?写日志类型的文件,开一个新线程不太好? 你丫就是没事找抽型的人物
您如果是觉得自己技术很牛逼,您就牛比吧 ,别在这里装得很二
BeanJoy 2014-04-29
  • 打赏
  • 举报
回复
引用 17 楼 zhangyacheng_1 的回复:
[quote=引用 16 楼 BeanJoy 的回复:] [quote=引用 15 楼 zhangyacheng_1 的回复:] [quote=引用 14 楼 BeanJoy 的回复:] [quote=引用 13 楼 zhangyacheng_1 的回复:] [quote=引用 12 楼 BeanJoy 的回复:] 不用多线程的话,就用同步吧。 比如: 写日志函数 { 进入临界区 写日志进文件并刷新 退出临界区 } 用一个简单的临界区就搞定了,多个线程只能有一个线程在临界区中执行代码。
请教一下,使用临界区的时候,会不会导致程序的执行结果出错,比如:多个线程抢占资源的时候,没有抢到临界区的线程只是处于等待状态,还是先干别的事儿等获得临界区时候再写日志,线程间的数据会不会因为临界区而出现异常 ? [/quote] 这个就看你怎么设计了。程序出错、崩溃这些都是程序上的BUG,算你使用临界区的问题,不是临界区本身的问题。 如果使用临界区,没抢到资源就只有等待。若不想等待,可使用事件。[/quote] 刚才我可能没有表达清楚我的意思, 我就是想问问是不是当使用临界区时候,某个线程没有抢到资源的话,她就停在进入临界区这句代码出,后面的代码处于等待状态。直到临界区被她抢到, 再执行进入临界区之后的代码 ????[/quote] 是这个意思。 所以使用临界区会影响效率。如果使用另一个线程来写日志,其他写日志的线程只需将日志信息加入到这个线程中的一列表就可返回了,写日志线程就慢慢写,不影响其他线程。[/quote] 你意思是说,如果建立一个全局队列存放日志内容比较好。比如:当需要写日志时候,就把一句日志push进全局队列末尾,而写日志的线程实时地把全局队列上的数据写入文件。这样就基本不影响原来程序的效率 ???????[/quote] 是的。全局队列也是一个共享资源,各个线程访问是也要加锁,但是访问全局队列仅仅是一个存取的操作,完全在内存中完成,效率比加锁文件的写高得多。
张亚成 2014-04-29
  • 打赏
  • 举报
回复
引用 16 楼 BeanJoy 的回复:
[quote=引用 15 楼 zhangyacheng_1 的回复:] [quote=引用 14 楼 BeanJoy 的回复:] [quote=引用 13 楼 zhangyacheng_1 的回复:] [quote=引用 12 楼 BeanJoy 的回复:] 不用多线程的话,就用同步吧。 比如: 写日志函数 { 进入临界区 写日志进文件并刷新 退出临界区 } 用一个简单的临界区就搞定了,多个线程只能有一个线程在临界区中执行代码。
请教一下,使用临界区的时候,会不会导致程序的执行结果出错,比如:多个线程抢占资源的时候,没有抢到临界区的线程只是处于等待状态,还是先干别的事儿等获得临界区时候再写日志,线程间的数据会不会因为临界区而出现异常 ? [/quote] 这个就看你怎么设计了。程序出错、崩溃这些都是程序上的BUG,算你使用临界区的问题,不是临界区本身的问题。 如果使用临界区,没抢到资源就只有等待。若不想等待,可使用事件。[/quote] 刚才我可能没有表达清楚我的意思, 我就是想问问是不是当使用临界区时候,某个线程没有抢到资源的话,她就停在进入临界区这句代码出,后面的代码处于等待状态。直到临界区被她抢到, 再执行进入临界区之后的代码 ????[/quote] 是这个意思。 所以使用临界区会影响效率。如果使用另一个线程来写日志,其他写日志的线程只需将日志信息加入到这个线程中的一列表就可返回了,写日志线程就慢慢写,不影响其他线程。[/quote] 你意思是说,如果建立一个全局队列存放日志内容比较好。比如:当需要写日志时候,就把一句日志push进全局队列末尾,而写日志的线程实时地把全局队列上的数据写入文件。这样就基本不影响原来程序的效率 ???????
gz_qmc 2014-04-28
  • 打赏
  • 举报
回复
内存映射文件 多线程写 各写一段 互不干涉 什么?写的是日志? 什么?写日志类型的文件,开一个新线程不太好? 你丫就是没事找抽型的人物
zmyouren1983 2014-04-28
  • 打赏
  • 举报
回复
如果没有太高的效率要求,使用锁就行,不用开线程。
BeanJoy 2014-04-28
  • 打赏
  • 举报
回复
哈哈,这帖帖赵老师那日志的例子再合适不过啦.
肆水東澤 2014-04-28
  • 打赏
  • 举报
回复
会,那你就是多个线程在操作往一个文件里写数据了
张亚成 2014-04-28
  • 打赏
  • 举报
回复
引用 5 楼 fqzlala 的回复:
你可以做个写文件的线程,用一串盒子装写入的内容,线程就不停的去取盒子的内容写文件,没有盒子了,就等待
如果连个线程同时往盒子里面仍数据, 不使用同步的话,会不会出现仍不进去问题 ?
肆水東澤 2014-04-28
  • 打赏
  • 举报
回复
你可以做个写文件的线程,用一串盒子装写入的内容,线程就不停的去取盒子的内容写文件,没有盒子了,就等待
躺着睡的蜗牛 2014-04-28
  • 打赏
  • 举报
回复
定义个自定义消息, 在自定义消息里做。
肆水東澤 2014-04-28
  • 打赏
  • 举报
回复
如楼上所说,线程同步! 一个坑位,一个一个使用
张亚成 2014-04-28
  • 打赏
  • 举报
回复
引用 1 楼 worldy 的回复:
必须使用同步,否则会互相覆盖,但是,这样一来,多线程写同一个文件是没有什么意思的了。 lz实际可以将要写入文件的内容提交给一个线程,由写文件线程完成写文件操作
你说的这个方法确实很NiuB,但是这个方法实现起来要新开线程,显得不是很好。
worldy 2014-04-28
  • 打赏
  • 举报
回复
必须使用同步,否则会互相覆盖,但是,这样一来,多线程写同一个文件是没有什么意思的了。 lz实际可以将要写入文件的内容提交给一个线程,由写文件线程完成写文件操作
第12章 Visual C++ 2010 MFC文件与 第12章 注册表操作 479 12.1 文本操作串行化 479 12.1.1 文档类Serialize()函数 479 12.1.2 CArchive对文件进行读 482 12.1.3 文档操作串行化代码分析 485 12.2 CFile类 492 12.2.1 打开文件操作 493 12.2.2 读文件操作 494 12.2.3 定位文件操作 496 12.2.4 关闭文件操作 497 12.2.5 异常操作 497 12.2.6 文件管理操作 498 12.3 .ini文件操作 500 12.4 注册表读操作 502 12.4.1 注册表简介 502 12.4.2 注册表API 504 12.4.3 访问并修改注册表 507 12.5 小结 509 第13章 Visual C++ 2010 MFC数据库 第13章 开发 510 13.1 数据库基本知识 510 13.2 SQL语言的基础知识 511 13.3 ODBC访问数据库 512 13.3.1 注册ODBC数据库 512 13.3.2 创建一个MFC的ODBC 13.3.2 程序 514 13.3.3 程序结构分析 515 13.3.4 在视图上显示数据库查询 13.3.4 结果 520 13.3.5 对查询结果排序及设置查询 13.3.5 条件 524 13.3.6 动态设置查询条件并更新 13.3.6 查询结果 527 13.4 ODBC更新数据库 532 13.5 ODBC访问SQL Server 540 13.6 ADO数据库访问 543 13.6.1 ADO数据库访问概述 543 13.6.2 在Visual C++使用ADO 13.6.2 编程 546 13.7 ADO访问SQL Server数据库 556 13.8 小结 556 第14章 Visual C++2010 MFC多线程 第14章 程序设计 557 14.1 进程和多线程的概念 557 14.2 线程的创建 558 14.2.1 创建工作者线程 558 14.2.2 创建用户界面线程 559 14.3 线程的终止 560 14.4 设置线程的优先级 562 14.5 暂停及重新启动线程 563 14.6 线程间的通信 571 14.7 线程的同步 572 14.7.1 临界区 572 14.7.2 互斥量 573 14.7.3 事件 573 14.7.4 信号量 574 14.8 小结 579

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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