CSharp · Console
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 CellWars.Threading.AsyncLock();
for (var i = 0; i < 1000; ++i)
{
var raceCondition = 0;
// You can acquire the lock asynchronously
using (await asyncLock.LockAsync(CancellationToken.None))
{
await Task.WhenAll(
Task.Run(async () =>
{
// The lock is reentrant
using (await asyncLock.LockAsync(CancellationToken.None))
{
// The lock provides mutual exclusion
raceCondition++;
}
}),
Task.Run(async () =>
{
using (await asyncLock.LockAsync(CancellationToken.None))
{
raceCondition++;
}
})
);
}
if (raceCondition != 2)
{
Console.WriteLine("Not okay");
return;
}
}
Console.WriteLine("Ok");
}).Wait();
}
}