多进程写文件问题

sant 2008-07-28 10:11:10
windows平台下,有多个进程要同时写一个日志文件,请问有什么方便的办法,保证写文件的时候不存在竞争?谢谢!
...全文
564 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
templarzq 2008-07-29
  • 打赏
  • 举报
回复
mark
kantonwang2007 2008-07-29
  • 打赏
  • 举报
回复
1. 写文件函数加锁
2. 写文件开一个线程,其他线程往这个线程post消息
cnzdgs 2008-07-28
  • 打赏
  • 举报
回复
你所说的“协调竞争”具体指什么?系统底层有线程同步机制,一个线程正在访问文件时,其它线程要访问文件会自动等待。
sant 2008-07-28
  • 打赏
  • 举报
回复
如果只以共享的方式打开,不做任何lock处理,系统底层会帮助协调竞争么?有谁做过试验,或者有相关代码吗?谢谢
gaoteng1984 2008-07-28
  • 打赏
  • 举报
回复
LockFile在有别的进程访问文件时,会立即返回。
如果想让进程在此时阻塞,省得再去Sleep,可以用LockFileEx,不要加LOCKFILE_FAIL_IMMEDIATELY选项即可。
theendname 2008-07-28
  • 打赏
  • 举报
回复
CreateMutexW
cnzdgs 2008-07-28
  • 打赏
  • 举报
回复
多个线程同时访问同一个资源,不可能没有竞争,竞争是很正常的,也不需要避免,只要以共享方式打开,多个进程都可以访问文件,在访问文件时系统会自动处理线程同步,不会发生冲突,不过你自己要考虑数据的完整性。
Amuro1987218 2008-07-28
  • 打赏
  • 举报
回复
僵哥说的lockFile第一次看到,学习
Amuro1987218 2008-07-28
  • 打赏
  • 举报
回复
每个进程写文件时都用独享方式打开,写完后关闭,一旦打开失败说明其他进程正在读,这时sleep一段时间再试
僵哥 2008-07-28
  • 打赏
  • 举报
回复
注意查MSDN看看LockFile的参数以及参数的意义...
僵哥 2008-07-28
  • 打赏
  • 举报
回复
以共享(允读允写)模式打开文件,然后在写入之前先LockFile.
ZOthello 2008-07-28
  • 打赏
  • 举报
回复
mark up!!!
evileagle 2008-07-28
  • 打赏
  • 举报
回复
如果所有的进程都是你自己编的那么把写操作放到临界区里,保证数据完整性
sitych 2008-07-28
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 Amuro1987218 的回复:]
每个进程写文件时都用独享方式打开,写完后关闭,一旦打开失败说明其他进程正在读,这时sleep一段时间再试
[/Quote]
hxfjb 2008-07-28
  • 打赏
  • 举报
回复
使用互斥量同步访问文件句柄。
Mutex
Event
cnzdgs 2008-07-28
  • 打赏
  • 举报
回复
从理论上说,系统底层会保证在一次写请求未完成之前,不会插入其它线程的写请求。但文件不是“流”,实际多进程操作时,每次执行写文件时必须事先确定要写入的位置,无法在写文件时指定把数据写到文件末尾,这样当两个进程同时写文件时,就会产生相互覆盖的情况。如果要解决这个问题,最简单的做法是每次写文件前以非独占方式打开文件,写完之后关闭文件。也可以用命名对象实现线程同步等方法。
另外目前VC中的fprintf函数不是一次写入文件的,如果使用这个函数需要自己处理线程同步。
sant 2008-07-28
  • 打赏
  • 举报
回复
我的意思是多个"进程"同时""一个以共享方式打开的文件时,会不会出现一个进程写了半行,然后接着其它进程跟着写了半行的情况。当写文件存在竞争的情况下,是操作系统保证写得原子性,还是需要通过程序中的同步机制来保证写得原子性。
系统底层api,或者fprintf这样标准的带缓冲的函数,对于共享文件上的写竞争的是怎么处理的?有可以参考的介绍,或者试验吗?谢谢

15,471

社区成员

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

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