ここに私のコードの断片があります。前のスレッドが終了するまで待たずに、1 つのスレッドが機能するはずです。しかし、すべてのスレッドが連続して開始され、パルス呼び出しがそれらの動作に影響を与えないことを認識しました。
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* をキャプチャした場合、すべての読み取りスレッドを一時停止する必要があります。