class Program
{
static
void Main()
{
new Thread(Read) { IsBackground =
true }.Start();
new Thread(Read) { IsBackground =
true }.Start();
new Thread(Read) { IsBackground =
true }.Start();
new Thread(Read) { IsBackground =
true }.Start();
new Thread(Read) { IsBackground =
true }.Start();
new Thread(() => Write(
"
T1
")) { IsBackground =
true }.Start();
new Thread(() => Write(
"
T2
")) { IsBackground =
true }.Start();
Thread.Sleep(TimeSpan.FromSeconds(
30));
}
static ReaderWriterLockSlim rwl =
new ReaderWriterLockSlim();
static Dictionary<
int,
int> items =
new Dictionary<
int,
int>();
static
void Read()
{
Console.WriteLine(
"
Readind contents of a dictionary
");
while (
true)
{
try
{
rwl.EnterReadLock();
foreach (
var item
in items.Keys)
{
Thread.Sleep(TimeSpan.FromSeconds(
0.1));
Console.WriteLine(items[item]);
}
}
finally
{
rwl.ExitReadLock();
}
}
}
static
void Write(
string threadName)
{
while (
true)
{
try
{
int newKey =
new Random().Next(
250);
rwl.EnterUpgradeableReadLock();
if (!items.ContainsKey(newKey))
{
try
{
rwl.EnterWriteLock();
items[newKey] = newKey;
Console.WriteLine(
"
New Key {0} is added to a dictionary by a {1}
", newKey, threadName);
}
finally
{
rwl.ExitWriteLock();
}
}
Thread.Sleep(TimeSpan.FromSeconds(
0.1));
}
finally { rwl.ExitUpgradeableReadLock(); } } } }