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

张亚成 2014-04-28 04:35:55
最进一个程序上老出问题,就使用CFile类写日志文件看看问题到底出在哪儿了,在单线程程序中使用的时候,文件写的好像是对的(因没有没有发现写日志不合理的地方),在多线程程序中使用CFile写日志时候,发现日志内容断断续续的。少了好多,不知怎么处理。
...全文
325 18 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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
  • 打赏
  • 举报
回复
内存映射文件 多线程写 各写一段 互不干涉 什么?写的是日志? 什么?写日志类型的文件,开一个新线程不太好? 你丫就是没事找抽型的人物
  • 打赏
  • 举报
回复
如果没有太高的效率要求,使用锁就行,不用开线程。
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实际可以将要写入文件的内容提交给一个线程,由写文件线程完成写文件操作

15,473

社区成员

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

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