程序中有两个线程tA和tB,tA会在随机的时间去读取硬盘的图片文件p,而tB则会在随机的时间去改写硬盘的图片文件p。可以采取哪些方法去避免线程tA和tB同时访问文件p呢?
谢谢指点!

解决方案 »

  1.   

    你可以设定一个规则,如A读取a-m开头的文件,b读取其他的文件
    或者先列出所有文件的集合,再进行分配
      

  2.   

    应该像锁的概念,就是当tA在给p做操作的时候就锁住,不让tB去访问,同理tB也是如此。
      

  3.   

    谢谢孟老师的回复,程序逻辑中,不好设置某个规则去避免。能否使用“尝试”(try)的方式,如B“尝试”着去改写文件,如果发现文件已被A占用,则等待一定的时间后,再去尝试。我现在的代码,调试中,一旦被占用,程序就报错并退出了。
    不知道c#有没有这样的方法?感谢指点。
      

  4.   

    你可以定义一个正在访问的文件名变量
    如果而tB则会在随机的时间去改写硬盘的图片文件p与正在访问的文件与变量相等,就跳过它去访问修下一个!
      

  5.   

    看看  多线程的东西,用lock,也有好几个类用来实现同步的
      

  6.   

    如果你通过 File 对象去访问文件。而且不涉及自身变量的同步问题。那么锁是操作系统已经完成的了。一个文件在打开的时候,就被赋予权限控制,包括共享读、只读、只写等等。如果你试图访问一个已经锁定的文件,会收到一个拒绝访问的IO异常。
      

  7.   

    “试图访问一个已经锁定的文件,会收到一个拒绝访问的IO异常”,我的程序是直接终止了。是使用try{}catch{}的方法去获取这个异常,而不退出吗?
      

  8.   

    可以try
    {}
    catch (IOException ex)
    {
        ...
    }
    catch (Exception ex)
    {
        其他错误
    }
      

  9.   

    本帖最后由 caozhy 于 2011-09-22 21:07:09 编辑
      

  10.   

    再问caozhy大师一个相关的问题:try catch是否会CPU的运算量比较大,也就是比较耗时的?
      

  11.   

    但是你一定要写一个while (true)
    {
        try { } catch { }
    }那我也没办法。
      

  12.   

    谢谢caozhy大师及楼上各位的帮助!明天我再重新写过代码,今晚的加班就到此了。