首页 新闻 会员 周边 捐助

关于线程同步的问题

0
悬赏园豆:200 [已解决问题] 解决于 2009-05-26 00:33


    public class TomUtil
    {
        static Hashtable Mutex = new Hashtable();
        public static void SaveXmlFile(string xmlFile)
        {
  lock(Mutex){
            if (Mutex[xmlFile] == null)
                Mutex[xmlFile] = xmlFile;}
            lock (Mutex[xmlFile])
            {
                DirectoryInfo folder = new FileInfo(xmlFile).Directory;
                if (!folder.Exists)
                    folder.Create();

                using (Stream writer = new FileStream(xmlFile, FileMode.Create))
                {
                    ...
                }
            }
        }
    }

1.这段程序有没有问题

2.需要改成这样吗:lock(Mutex){
            if (Mutex[xmlFile] == null)
                Mutex[xmlFile] = xmlFile;}

3.lock(Mutex)跟lock(Mutex[xmlFile])不会有冲突吧

问题补充: lock(Mutex[xmlFile])是必要的,因为多线程里Stream writer = new FileStream(xmlFile, FileMode.Create)是有可能出异常的,已经实践检验过了。关键是给Mutex[xmlFile]赋值时,有没有必要加lock(Mutex)。 @Azuresong, 恩,我也觉得是,但是我不太清楚用lock是否对性能有所影响,如果影响太大,是不是不lock更好些,因为即使重复赋值好像也并不会影响程序的正确性。
灰灰狼的主页 灰灰狼 | 初学一级 | 园豆:5
提问于:2009-05-25 10:47
< >
分享
最佳答案
0

如果使用Hashtable,同步的时候使用 lock (Mutex.SyncRoot);

也可以使用Hashtable的线程安全版本:static Hashtable Mutex = Hashtable.Synchronized(new Hashtable()),就不用显式Lock了。

Lock(Mutex) 会影响 Lock(Mutex[xmlFile]) ,比如当一个线程 A 已经 Lock(Mutex)后,此时另一个线程 B 想要去 Lock(Mutex[xmlFile]) ,这个时候,操作 Mutex[xmlFile] 会进入等待队列,因为 Mutex 已经被线程 A 占用。

在你的例程中,由于 Mutex[xmlFile] = xmlFile 操作耗时极短,这种现象不明显,如果你加上 Thread.Sleep(5000) ,你就会明显的感觉出差别。

所以,Lock(Mutex) 是没必要的,如果你不放心,你可以使用 Hashtable.Synchronized 创建 Mutex .

Launcher | 高人七级 |园豆:45050 | 2009-05-25 19:11
其他回答(2)
0

我个人觉得,lock (Mutex[xmlFile]) 没有必要。

hoodlum1980 | 园豆:573 (小虾三级) | 2009-05-25 11:09
0

在你的代码里lock(Mutex)的确有用,可以避免对Mutex[xmlFile]重复负值。

Azuresong | 园豆:3565 (老鸟四级) | 2009-05-25 12:01
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册