using System.Threading.Tasks;
public static class Locks
public static readonly SemaphoreSlim ReadLock = new(1,1);
public static readonly SemaphoreSlim WriteLock = new(1,1);
public class ThreadLikeSomethingProcessor
public static void Main()
for (var i = 0; i < 10; ++i)
var thread = new Thread(DoWork);
private static Task ReadData(object num)
Task writeLockTask = null;
var rLock = Locks.ReadLock;
writeLockTask = Locks.WriteLock.WaitAsync();
Console.WriteLine($"read start {num}");
Thread.Sleep(1000*(int)num);
Console.WriteLine($"read end {num}");
private static void WriteData(object num)
Console.WriteLine($"write {num}");
public static void DoWork(object num)
var writeLockTask = ReadData(num);
Locks.WriteLock.Release();