请大虾谈谈:线程读文件(50分)

  • 主题发起人 主题发起人 iseek
  • 开始时间 开始时间
I

iseek

Unregistered / Unconfirmed
GUEST, unregistred user!
一个自定义格式文件,以fmOpenReadWrite方式打开,通过界面操作,可以读写.
现在想开一线程,目的是遍历该文件数据.
我的困惑是:线程运行时,用户有可能通过界面操作,与线程同时读该文件的某段数据.这样做安全吗?如果不安全,有什么方法可以避免?
谢谢.
 
Synchronize
 
如果这也要Synchronize,那跟在主线程里操作没有什么两样吧
 
lz的安全问题如果是指对同一段数据并发处理时要保证一致性的话,那是一定要加锁同步的。锁也有好几种,建议lz去看关系数据库原理方面的书,特别是关于事务以及并发控制的章节,了解一下为什么要封锁。[:)]
 
可以,但window只是控制了文件的读写权限,并没有控制同步读写,所以手工同步是必要的。可以使用临界来完成,即界面读,线程写的时候分别使用临界来保护,比如:
Lock:TCritcalSection
读,写的时候:
Lock.Enter;
Try
读或写文件;
Finally
Lock.Exit;
end;
操作文件数据...
 
请问,如果线程仅仅是读数据呢?也不安全吗?
 
举个实际的不安全的例子吧,比如两个售票的网点开始售票,A售票点读取当前的票数假如是15,由于没有加锁,此时B售票点也可以读取数据,读到的也是15,A售票点售出一张票,并把数据回写为14,而B点售出一张票后,也回写14,这样就会把A的修改丢失掉,造成实际卖出两张票,而数据只少了一张。或者你说,我不回写,直接在原数据上作减一修改,不是可以解决上面的问题吗。那好,假设只有最后一张票了,A点和B点都认为还可以卖一张票,然后A点先把票卖出去了,B点再想卖票的时候,发现最后一张票突然就不见了,如果你去买票的时候,工作人员明明告诉你还有一张票的,结果当你准备付钱的时候,他说对不起没有了,我想你一定想揍他吧。
 
用临界区
 
简单的说只要一个文件只有一个线程操作就是安全的,大于1个线程的读写操作是不安全的,但如果所有线程都是读那是安全的。
 
这里的安全有一个限制,不能使用一个文件句柄
 
这里的安全有一个限制,不能使用同一个文件句柄
 
谢谢appfirst大虾和各位热心人.
已基本明白.
但还有个疑问:除主线程外,如果有两个子线程都要读同一个文件,这时,如果使用了临界,另一个子线程试图读该文件时,会发生什么?如何处理?
 
多人接受答案了。
 
后退
顶部