日期:2014-05-17  浏览次数:21081 次

请教:C#加锁的问题
大家好,我想实现这样的一个需求:
随机生成一个目录名称,如果这个目录不存在,那么就创建,如果存在,就重新生成,直到目录不存在并生成为止,但是运行这段代码的线程可能有成千上万个,所以需要加锁,并且效率要尽可能高。
我是这样想的:判断目录是否存在、创建新的目录,这应该是一个原子操作。但是如果两个线程生成的不是同一个路径,那么它们就不应该互斥,只有在生成的目录名称完全相同时,才需要互斥。
例如:
线程1生成的path="C:\folder1"
线程2生成的path="C:\folder1"
由于线程1和线程2生成的路径相同,所以应该进行互斥操作,避免出错。
但是如果:
线程1生成的path="C:\folder1"
线程2生成的path="C:\folder2"
由于线程1和线程2生成的路径不相同,所以不需要进行互斥操作。
不知道如何实现该需求?或者应该使用哪个锁?
谢谢大家。

------解决方案--------------------
		private object thisLock = new object();

public void YourThreading() {
string temppath;
//ToDo Something
lock (thisLock) {
if (Directory.Exists(temppath)) {
Directory.CreateDirectory(temppath);
}else{
//ToDo Something
}
}
}

------解决方案--------------------
楼主,按你的这个需求来说,单线程模型才是最适合你的。

首先,硬盘读写是线性读写性能是最高的,也就是说一个线程专门负责去读写效率是最高的。
其次,你的业务逻辑也不适合多线程,单单线程间的切换开销就是很大的了,你的线程处理时间相于切换时间的比值太低,大量的重复你这个处理逻辑的时候,线程切换的开销就可当可观了。另外,由于多线程同步带来的锁开销也是相当大的。