Flettu vs reentrance and mutual exclusion

CSharp · Console

/Program.cs

using System;
using System.Threading.Tasks;
using System.Threading;
					
public class Program
{
	public static void Main()
	{
		Task.Run(async () =>
		{
			await Task.Delay(TimeSpan.FromSeconds(2));
			Console.WriteLine("Deadlocked?");
		});
		Task.Run(async () =>
		{
			var asyncLock = new Flettu.Lock.AsyncLock();
            for (var i = 0; i < 1000; ++i)
            {
                var raceCondition = 0;
                // You can acquire the lock asynchronously
                using (await asyncLock.AcquireAsync(CancellationToken.None))
                {
                    await Task.WhenAll(
                        Task.Run(async () =>
                        {
                            // The lock is reentrant
                            using (await asyncLock.AcquireAsync(CancellationToken.None))
                            {
                                // The lock provides mutual exclusion
                                raceCondition++;
                            }
                        }),
                        Task.Run(async () =>
                        {
                            using (await asyncLock.AcquireAsync(CancellationToken.None))
                            {
                                raceCondition++;
                            }
                        })
                    );
                }
				if (raceCondition != 2)
				{
					Console.WriteLine("Not okay");
					return;
				}
            }
			Console.WriteLine("Ok");
		}).Wait();
	}
}
;