dotnet中线程处理的类ReaderWriterLock中有地方不明白意义何在,
请高手解答:
1.这个类支持递归的读/写线程锁请求, 那递归锁主要的应用是什么?
2.ReleaseLock 后再RestoreLock 主要的应用又是什么? RestoreLock参数LockCookie是ref的,那也就是说此方法
 对LockCookie的操作有返回数据? 这个数据又如何用?

解决方案 »

  1.   

    1、因为有多个reader,1个writer。 这个递归锁是允许多个reader同时进行加锁。
       去补补os的reader-writer问题。
    2、release是锁清0了,restore是恢复。没用过restore,不过在事务回滚的时候应该有用。
    3、ref未必是输出类型吧。output才是真正的输出类型。听听其他人怎么说。
      

  2.   

    1.递归的读/写线程锁请求? 递归? 不明白。你在哪里看到的。这个类主要用在有大量线程读,而写较少的情况下,来获取较好的性能。优于使用Monitor等。。因为用这个,在同一时间只有获取了锁的线程才能访问。当写持续时间短,而读占主要的情况下,使用这个类。
    2.ReleaseLock 表示当前线程释放对锁的控制,RestoreLock 当然是重新获取锁。至于LockCookie数据不是你需要操心的。如果你用过WIN32的临界区函数就该明白。这个是系统保存同步数据用的。
      

  3.   

    递归锁是说可以在ReaderWriterLock多次获取同一锁, 如果是非递归的会导致死锁,因为ReaderWriterLock是递归的,所以你调用多次也不会死锁,
      

  4.   

    谢谢各位回复, 再说明下
    1.
    MSDN上一段话:
    "AcquireReaderLock 支持递归读线程锁请求。也就是说,线程可以多次调用 AcquireReaderLock,并且每次调用时会增加锁计数。每次调用 AcquireReaderLock 时,必须调用一次 ReleaseReaderLock。或者,可以调用 ReleaseLock 将锁计数立即减到零。总是立即授予递归锁请求,而无须将请求线程放入读线程队列中。小心使用递归锁,避免长时间阻止写线程锁请求。
    "
    这里的递归指在一个线程上,多次调用请求.  想问的是:既然这个线程已经获得锁,为何会再次请求? (即它的典型用法用法)2.我想问的是获取以前的锁状态,它的典型用法是什么? 如Efcndi所说的用于事务处理?
      

  5.   

    “既然这个线程已经获得锁,为何会再次请求?”这个递归重入的使用确实很少碰到。我一时也找不到好的使用例子。
    使用方法类下:
    比如:ReaderWriterLock Lock = new ReaderWriterLock();
    Reader()

      ReaderWriterLock.AcquireReaderLock(1000);  
      doSomething();
         ReaderWriterLock.AcquireReaderLock(1000);
         doSomething();
         Lock.ReleaseReaderLock();
      Lock.ReleaseReaderLock();
    }这是否是允许多个reader来lock而产生的一个副品,有待其他人来回答你吧。
      

  6.   

    刚要睡觉。想到了一个看看是不是有用:ReaderWriterLock支持递归锁,那么我们可以递归函数里加锁释放锁,
    而reader线程可以调用该递归函数。Reader() //Thread
    {
      DFS();    
    }DFS()

      Lock.AcquireReaderLock(1000); 
      doSomething();
      Lock.ReleaseReaderLock(); 
    }一个能想到的例子是在数据库存放树节点,对于取出的datatable,
    读线程用dfs来读datatable创建树节点。
    这样递归锁就有用了。不过这个例子还有点牵强,我一般使用bfs来读。
    而且太深的递归也是不推荐的。初步的想法,没有“theory”支持。
    明天在找找这方面的资料吧。睡觉了。
      

  7.   

    参考http://book.csdn.net/bookfiles/309/10030912814.shtml
    昨天的想法还是bingo的。递归锁(Recursive Lock)  递归锁是指可以被当前持有该锁的线程重复获取,而不会导致该线程产生死锁的锁类型。对递归锁而言,只有在当前持有线程的获取锁操作都有一个释放操作与之对应时,其他线程才可以获取该锁。因此,在使用递归锁时,必须要用足够的释放锁操作来平衡获取锁操作,实现这一目标的最佳方式是在单入口单出口代码块的两头一一对应地使用获取、释放操作,做法和在普通锁中一样。递归锁在递归函数中最有用。但是,总的来说,递归锁比非递归锁速度要慢。图4-10给出了一个递归锁的使用范例。Recursive_Lock Lvoid recursiveFunction (int count) {L->acquire()if (count > 0) {count = count - 1;recursiveFunction(count);}L->release();}
      

  8.   

    关于线程的,先看完MSDN再来回你吧.