fork download
  1. namespace locking
  2. {
  3. public class LockTest
  4. {
  5. private ReaderWriterLockSlim m_lock = new();
  6.  
  7. public void DoWork(int i)
  8. {
  9. Console.WriteLine($"{i}: DoWork()");
  10. m_lock.EnterUpgradeableReadLock();
  11. Console.WriteLine($"{i}: acquired read lock");
  12. try
  13. {
  14. Thread.Yield();
  15. Thread.Sleep(500);
  16. Thread.Yield();
  17. Console.WriteLine($"{i}: sleep complete");
  18. if (m_lock.TryEnterWriteLock(timeout: TimeSpan.FromMilliseconds(500)))
  19. {
  20. try
  21. {
  22. Console.WriteLine($"{i}: acquired write lock");
  23. Thread.Yield();
  24. Thread.Sleep(500);
  25. Thread.Yield();
  26. }
  27. finally
  28. {
  29. m_lock.ExitWriteLock();
  30. Console.WriteLine($"{i}: released write lock");
  31. Thread.Yield();
  32. }
  33. }
  34. else
  35. {
  36. Console.WriteLine($"{i}: failed to acquire write lock");
  37. Thread.Yield();
  38. }
  39. }
  40. finally
  41. {
  42. m_lock.ExitUpgradeableReadLock();
  43. Console.WriteLine($"{i}: released read lock");
  44. }
  45. }
  46. }
  47.  
  48. internal class Program
  49. {
  50.  
  51. static void Main(string[] args)
  52. {
  53. var lockTest = new LockTest();
  54. var tasks = Enumerable.Range(1, 10).Select(i => Task.Run(() => lockTest.DoWork(i))).ToArray();
  55. Task.WaitAll(tasks);
  56. }
  57. }
  58. }
  59.  
Success #stdin #stdout 0.08s 32008KB
stdin
Standard input is empty
stdout
1: DoWork()
1: acquired read lock
2: DoWork()
1: sleep complete
1: acquired write lock
1: released write lock
1: released read lock
2: acquired read lock
3: DoWork()
2: sleep complete
2: acquired write lock
4: DoWork()
2: released write lock
2: released read lock
5: DoWork()
3: acquired read lock
3: sleep complete
3: acquired write lock
6: DoWork()
3: released write lock
3: released read lock
7: DoWork()
4: acquired read lock
4: sleep complete
4: acquired write lock
8: DoWork()
4: released write lock
4: released read lock
9: DoWork()
5: acquired read lock
5: sleep complete
5: acquired write lock
10: DoWork()
5: released write lock
5: released read lock
6: acquired read lock
6: sleep complete
6: acquired write lock
6: released write lock
6: released read lock
7: acquired read lock
7: sleep complete
7: acquired write lock
7: released write lock
7: released read lock
8: acquired read lock
8: sleep complete
8: acquired write lock
8: released write lock
8: released read lock
9: acquired read lock
9: sleep complete
9: acquired write lock
9: released write lock
9: released read lock
10: acquired read lock
10: sleep complete
10: acquired write lock
10: released write lock
10: released read lock