这是我的代码片段。我想,一个线程应该工作而不必等到前一个线程完成。但我认识到所有线程都是串联开始的,我的脉冲调用对它们的工作方式没有影响。
class A
{
string path = "file.xml";
static public object _lock = new object();
static private int accessCounter = 0;
public List<T> GetItems()
{
List<T> result = null;
lock (_lock)
{
while (accessCounter < 0)
Monitor.Wait(_lock);
accessCounter++;
Thread.Sleep(1000);
Monitor.Pulse(_lock);
Thread.Sleep(1000);
using (Stream stream = File.OpenRead(path))
{
XmlSerializer serializer = new XmlSerializer(typeof(List<T>), new Type[] { typeof(T) });
result = (List<T>)serializer.Deserialize(stream);
}
accessCounter--;
Monitor.Pulse(_lock);
}
return result;
}
public void AddItem(T item)
{
lock(_lock){if (accessCounter!=0) Monitor.Wait(_lock);
accessCounter = -1;
//some writing ooperations
accessCounter = 0;
}
}
}
我知道if条件在当前情况下是无用的,因为它总是true。更重要的是,它们应该同时工作,但不能。
编辑:此代码从不同的线程以下列方式调用:
.....
A a = new A();
var list = a.GetItems();
.....
它应该是某种写/读块。因此,如果线程想要读取并且其他线程已经在读取文件,那么它不必等待其他线程。现在,如果其他线程捕获 *_lock*,则所有读取线程都需要挂起