多线程15-ReaderWriterLockSlim
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();
}
}
}
}
{
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();
}
}
}
}