namespace locking
{
public class LockTest
{
private ReaderWriterLockSlim m_lock = new();
public void DoWork(int i)
{
Console.WriteLine($"{i}: DoWork()");
m_lock.EnterUpgradeableReadLock();
Console.WriteLine($"{i}: acquired read lock");
try
{
Thread.Yield();
Thread.Sleep(500);
Thread.Yield();
Console.WriteLine($"{i}: sleep complete");
if (m_lock.TryEnterWriteLock(timeout: TimeSpan.FromMilliseconds(500)))
{
try
{
Console.WriteLine($"{i}: acquired write lock");
Thread.Yield();
Thread.Sleep(500);
Thread.Yield();
}
finally
{
m_lock.ExitWriteLock();
Console.WriteLine($"{i}: released write lock");
Thread.Yield();
}
}
else
{
Console.WriteLine($"{i}: failed to acquire write lock");
Thread.Yield();
}
}
finally
{
m_lock.ExitUpgradeableReadLock();
Console.WriteLine($"{i}: released read lock");
}
}
}
internal class Program
{
static void Main(string[] args)
{
var lockTest = new LockTest();
var tasks = Enumerable.Range(1, 10).Select(i => Task.Run(() => lockTest.DoWork(i))).ToArray();
Task.WaitAll(tasks);
}
}
}
bmFtZXNwYWNlIGxvY2tpbmcKewoJcHVibGljIGNsYXNzIExvY2tUZXN0Cgl7CgkJcHJpdmF0ZSBSZWFkZXJXcml0ZXJMb2NrU2xpbSBtX2xvY2sgPSBuZXcoKTsKCgkJcHVibGljIHZvaWQgRG9Xb3JrKGludCBpKQoJCXsKCQkJQ29uc29sZS5Xcml0ZUxpbmUoJCJ7aX06IERvV29yaygpIik7CgkJCW1fbG9jay5FbnRlclVwZ3JhZGVhYmxlUmVhZExvY2soKTsKCQkJQ29uc29sZS5Xcml0ZUxpbmUoJCJ7aX06IGFjcXVpcmVkIHJlYWQgbG9jayIpOwoJCQl0cnkKCQkJewoJCQkJVGhyZWFkLllpZWxkKCk7CgkJCQlUaHJlYWQuU2xlZXAoNTAwKTsKCQkJCVRocmVhZC5ZaWVsZCgpOwoJCQkJQ29uc29sZS5Xcml0ZUxpbmUoJCJ7aX06IHNsZWVwIGNvbXBsZXRlIik7CgkJCQlpZiAobV9sb2NrLlRyeUVudGVyV3JpdGVMb2NrKHRpbWVvdXQ6IFRpbWVTcGFuLkZyb21NaWxsaXNlY29uZHMoNTAwKSkpCgkJCQl7CgkJCQkJdHJ5CgkJCQkJewoJCQkJCQlDb25zb2xlLldyaXRlTGluZSgkIntpfTogYWNxdWlyZWQgd3JpdGUgbG9jayIpOwoJCQkJCQlUaHJlYWQuWWllbGQoKTsKCQkJCQkJVGhyZWFkLlNsZWVwKDUwMCk7CgkJCQkJCVRocmVhZC5ZaWVsZCgpOwoJCQkJCX0KCQkJCQlmaW5hbGx5CgkJCQkJewoJCQkJCQltX2xvY2suRXhpdFdyaXRlTG9jaygpOwoJCQkJCQlDb25zb2xlLldyaXRlTGluZSgkIntpfTogcmVsZWFzZWQgd3JpdGUgbG9jayIpOwoJCQkJCQlUaHJlYWQuWWllbGQoKTsKCQkJCQl9CgkJCQl9CgkJCQllbHNlCgkJCQl7CgkJCQkJQ29uc29sZS5Xcml0ZUxpbmUoJCJ7aX06IGZhaWxlZCB0byBhY3F1aXJlIHdyaXRlIGxvY2siKTsKCQkJCQlUaHJlYWQuWWllbGQoKTsKCQkJCX0KCQkJfQoJCQlmaW5hbGx5CgkJCXsKCQkJCW1fbG9jay5FeGl0VXBncmFkZWFibGVSZWFkTG9jaygpOwoJCQkJQ29uc29sZS5Xcml0ZUxpbmUoJCJ7aX06IHJlbGVhc2VkIHJlYWQgbG9jayIpOwoJCQl9CgkJfQoJfQoKCWludGVybmFsIGNsYXNzIFByb2dyYW0KCXsKCgkJc3RhdGljIHZvaWQgTWFpbihzdHJpbmdbXSBhcmdzKQoJCXsKCQkJdmFyIGxvY2tUZXN0ID0gbmV3IExvY2tUZXN0KCk7CgkJCXZhciB0YXNrcyA9IEVudW1lcmFibGUuUmFuZ2UoMSwgMTApLlNlbGVjdChpID0+IFRhc2suUnVuKCgpID0+IGxvY2tUZXN0LkRvV29yayhpKSkpLlRvQXJyYXkoKTsKCQkJVGFzay5XYWl0QWxsKHRhc2tzKTsKCQl9Cgl9Cn0K