dotnet中线程处理的类ReaderWriterLock中有地方不明白意义何在,
请高手解答:
1.这个类支持递归的读/写线程锁请求, 那递归锁主要的应用是什么?
2.ReleaseLock 后再RestoreLock 主要的应用又是什么? RestoreLock参数LockCookie是ref的,那也就是说此方法
对LockCookie的操作有返回数据? 这个数据又如何用?
请高手解答:
1.这个类支持递归的读/写线程锁请求, 那递归锁主要的应用是什么?
2.ReleaseLock 后再RestoreLock 主要的应用又是什么? RestoreLock参数LockCookie是ref的,那也就是说此方法
对LockCookie的操作有返回数据? 这个数据又如何用?
解决方案 »
- 对视频进行截图 然后讲截图在pictureBox1中显示
- (高分)C#中TransparentBlt函数问题后续???
- 一个初学者的C#简单问题
- 怎么设置dataGridView 列的宽度呢??
- 怎样配置连接数据库的字符窜?
- DataDrid的问题
- 在.net中,如何调试多线程程序?
- 一个简单的问题.(CCYYMMDD)
- 并行生成文件冲突问题
- WPF怎么在代码中访问,XAML中定义的ConTextMenu中的MenuItem项
- 有关P2P的NAT穿透的问题:NAT可以通过UDP来实现内网的某机器与外网的机器通信,那TCP可以用NAT来穿透内网吗?
- 上传图片时生成的缩略图变模糊的问题.....................
去补补os的reader-writer问题。
2、release是锁清0了,restore是恢复。没用过restore,不过在事务回滚的时候应该有用。
3、ref未必是输出类型吧。output才是真正的输出类型。听听其他人怎么说。
2.ReleaseLock 表示当前线程释放对锁的控制,RestoreLock 当然是重新获取锁。至于LockCookie数据不是你需要操心的。如果你用过WIN32的临界区函数就该明白。这个是系统保存同步数据用的。
1.
MSDN上一段话:
"AcquireReaderLock 支持递归读线程锁请求。也就是说,线程可以多次调用 AcquireReaderLock,并且每次调用时会增加锁计数。每次调用 AcquireReaderLock 时,必须调用一次 ReleaseReaderLock。或者,可以调用 ReleaseLock 将锁计数立即减到零。总是立即授予递归锁请求,而无须将请求线程放入读线程队列中。小心使用递归锁,避免长时间阻止写线程锁请求。
"
这里的递归指在一个线程上,多次调用请求. 想问的是:既然这个线程已经获得锁,为何会再次请求? (即它的典型用法用法)2.我想问的是获取以前的锁状态,它的典型用法是什么? 如Efcndi所说的用于事务处理?
使用方法类下:
比如:ReaderWriterLock Lock = new ReaderWriterLock();
Reader()
{
ReaderWriterLock.AcquireReaderLock(1000);
doSomething();
ReaderWriterLock.AcquireReaderLock(1000);
doSomething();
Lock.ReleaseReaderLock();
Lock.ReleaseReaderLock();
}这是否是允许多个reader来lock而产生的一个副品,有待其他人来回答你吧。
而reader线程可以调用该递归函数。Reader() //Thread
{
DFS();
}DFS()
{
Lock.AcquireReaderLock(1000);
doSomething();
Lock.ReleaseReaderLock();
}一个能想到的例子是在数据库存放树节点,对于取出的datatable,
读线程用dfs来读datatable创建树节点。
这样递归锁就有用了。不过这个例子还有点牵强,我一般使用bfs来读。
而且太深的递归也是不推荐的。初步的想法,没有“theory”支持。
明天在找找这方面的资料吧。睡觉了。
昨天的想法还是bingo的。递归锁(Recursive Lock) 递归锁是指可以被当前持有该锁的线程重复获取,而不会导致该线程产生死锁的锁类型。对递归锁而言,只有在当前持有线程的获取锁操作都有一个释放操作与之对应时,其他线程才可以获取该锁。因此,在使用递归锁时,必须要用足够的释放锁操作来平衡获取锁操作,实现这一目标的最佳方式是在单入口单出口代码块的两头一一对应地使用获取、释放操作,做法和在普通锁中一样。递归锁在递归函数中最有用。但是,总的来说,递归锁比非递归锁速度要慢。图4-10给出了一个递归锁的使用范例。Recursive_Lock Lvoid recursiveFunction (int count) {L->acquire()if (count > 0) {count = count - 1;recursiveFunction(count);}L->release();}