As I understand it, I need to use ReaderWriterLockSlim
from here:
https://learn.microsoft.com/en-us/dotnet/api/system.threading.readerwriterlockslim
I did everything like theirs, crashes with System.NullReferenceException
:
Object reference not set to an instance of an object.
Updated .... OK, I removed the check for null and added a check for the version of the object in each reading trade. Now works without errors - thanks Peter Duniho
using System;
using System.Threading;
public class Player {
public int id;
public override string ToString() {
return id.ToString();
}
}
public class SlimTest{
ReaderWriterLockSlim locker = new ReaderWriterLockSlim();
Random R = new Random();
Player _leader;
public Player leader {
get {
locker.EnterReadLock();
try {
return _leader;
}
finally {
locker.ExitReadLock();
}
}
}
int _id = 0;
public SlimTest() {
var main = new Thread(() => {
while(true) {
locker.EnterWriteLock();
try {
var cf = R.Next(1, 10) % 2;
if(cf > 0)
_leader = new Player() { id = _id += 1 };
}
finally {
locker.ExitWriteLock();
}
Thread.Sleep(R.Next(3, 10));
}
});
main.IsBackground = true;
main.Start();
for(int i = 0; i < 10;i++) {
var reader = new Thread(() => {
int my_id=0;
while(true) {
if(leader == null)
continue;
if(my_id != leader.id) {
my_id = leader.id;
Console.Write(leader.id);
}
else
Console.Write(".");
Thread.Sleep(R.Next(3, 10));
}
});
reader.IsBackground = true;
reader.Start();
}
}
}