Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -48,4 +48,39 @@ public void WhenReadOrAdd_ListCountIsEqualOne()

Assert.AreEqual(1, readerWriterLockSlimReadWrite.ListOfNumbers.Count);
}

[TestMethod]
public void WhenReadLockIsEnteredTwiceWithDefaultPolicy_ThrowsLockRecursionException()
{
using var readerWriterLockSlim = new ReaderWriterLockSlim();
readerWriterLockSlim.EnterReadLock();

Assert.ThrowsExactly<LockRecursionException>(() => readerWriterLockSlim.EnterReadLock());

readerWriterLockSlim.ExitReadLock();
}

[TestMethod]
public void WhenReadLockIsEnteredTwiceWithSupportsRecursion_RecursiveReadCountIsTwo()
{
using var readerWriterLockSlim = new ReaderWriterLockSlim(LockRecursionPolicy.SupportsRecursion);
readerWriterLockSlim.EnterReadLock();
readerWriterLockSlim.EnterReadLock();

Assert.AreEqual(2, readerWriterLockSlim.RecursiveReadCount);

readerWriterLockSlim.ExitReadLock();
readerWriterLockSlim.ExitReadLock();
}

[TestMethod]
public void WhenReadLockHolderEntersWriteLock_ThrowsLockRecursionException()
{
using var readerWriterLockSlim = new ReaderWriterLockSlim();
readerWriterLockSlim.EnterReadLock();

Assert.ThrowsExactly<LockRecursionException>(() => readerWriterLockSlim.EnterWriteLock());

readerWriterLockSlim.ExitReadLock();
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>

Expand All @@ -10,10 +10,10 @@
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.6.0" />
<PackageReference Include="MSTest.TestAdapter" Version="2.2.10" />
<PackageReference Include="MSTest.TestFramework" Version="2.2.10" />
<PackageReference Include="coverlet.collector" Version="3.2.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="18.11.0" />
<PackageReference Include="MSTest.TestAdapter" Version="4.5.1" />
<PackageReference Include="MSTest.TestFramework" Version="4.5.1" />
<PackageReference Include="coverlet.collector" Version="10.1.0" />
</ItemGroup>

<ItemGroup>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
namespace WhenToUseReaderWriterLockSlimOverLockInCSharp;

public static class AsyncPitfall
{
public static async Task<string> ExitWriteLockAfterAwait()
{
var readerWriterLockSlim = new ReaderWriterLockSlim();
var threadBefore = Environment.CurrentManagedThreadId;

readerWriterLockSlim.EnterWriteLock();
await Task.Delay(50);
var threadAfter = Environment.CurrentManagedThreadId;

try
{
readerWriterLockSlim.ExitWriteLock();

return $"Exited on the same thread ({threadBefore}).";
}
catch (SynchronizationLockException ex)
{
return $"{ex.GetType().Name} on thread {threadAfter} " +
$"(entered on thread {threadBefore}): {ex.Message}";
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

public class LockReadWrite : BaseReaderWriter
{
private static readonly object LockObject = new();
private static readonly Lock LockObject = new();

public override void AddNumbersToList(int writerExecutionsCount, int writerExecutionDelay)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,4 +18,6 @@

var readerWriterLockSlimReadWrite = new ReaderWriterLockSlimReadWrite();
Console.WriteLine($"ReaderWriterLockSlim execution time: " +
$"{readerWriterLockSlimReadWrite.Execute(config)} milliseconds.");
$"{readerWriterLockSlimReadWrite.Execute(config)} milliseconds.");

Console.WriteLine(await AsyncPitfall.ExitWriteLockAfterAwait());
Original file line number Diff line number Diff line change
Expand Up @@ -45,12 +45,12 @@ public override void ReadListCount(int readerExecutionsCount, int readerExecutio

public void ReadOrAdd(int writerExecutionDelay)
{
var random = Random.Shared.Next(0, NumbersList.Count);

ReaderWriterLockSlim.EnterUpgradeableReadLock();

try
{
var random = Random.Shared.Next(0, NumbersList.Count);

if (!NumbersList.Contains(random))
{
ReaderWriterLockSlim.EnterWriteLock();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net7.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
Expand Down
Loading