
10.01.2010, 12:33
|
|
Reservists Of Antichat - Level 6
Регистрация: 12.02.2006
Сообщений: 891
С нами:
10653446
Репутация:
836
|
|
Сообщение от Algol
Запостил вторую часть статьи
Оставшееся время обеда посвятил топику и хотелось бы кое что добавить. =)
во-первых, что почитать:
Само по себе классика Рихтер, но вот еще раз и два
во-вторых...
Бывают такие ситуации когда необходим куче потоков доступ на чтение и лишь один поток изменяет эти данные (либо наоборот)...
Представим банальную ситуацию, несколько потоков ведут журналирование работы в единый объект из которого один читает.
Для этого конечно же можно попыхтеть с секциями, следить за блокировками и тому подобное. Но можно поступить и проще, в .NET есть такой класс как - ReaderWriterLockSlim
Ниже идет пример с использованием класса:
PHP код:
using System;
using System.Threading;
namespace SharedRes
{
class ByClass
{
private string param; //переменная для свойства
private readonly ReaderWriterLockSlim rwl = new ReaderWriterLockSlim();
/// <summary>
/// Свойство используемое потоками
/// </summary>
public string SharedRes
{
get
{
var s = "";
try
{
rwl.EnterReadLock();
s = param;
}
catch(Exception e)
{
Console.WriteLine(e.Message); //Ловим исключения и выводим сообщение об ошибке
}
finally
{
rwl.ExitReadLock();
}
return s;
}
set
{
try
{
rwl.EnterWriteLock();
param = value;
}
finally
{
rwl.ExitWriteLock();
}
}
}
}
}
а тут без использования класса =)
PHP код:
using System;
using System.Threading;
namespace SharedRes
{
class ByLock
{
private readonly ManualResetEvent mreGet = new ManualResetEvent(true);
private readonly ManualResetEvent mreSet = new ManualResetEvent(true);
private int readers;
private string param;
private readonly object locker = new object();
/// <summary>
/// Свойство используемое потоками
/// </summary>
public string SharedRes
{
get
{
try
{
mreGet.WaitOne();
mreGet.Reset();
lock (locker)
{
Interlocked.Increment(ref readers); //Увеличивание счетчика на 1
}
var s = param;
lock (locker)
{
Interlocked.Decrement(ref readers); //Уменьшение счетчика на 1
}
return s;
}
finally
{
lock (locker)
{
if (readers == 0)
{
mreGet.Set();
}
}
}
}
set
{
try
{
mreGet.Reset();
mreSet.WaitOne();
mreSet.Reset();
param = value;
mreGet.Set();
mreSet.Set();
}
catch(Exception e)
{
Console.WriteLine(e.Message); //Ловим исключения и выводим сообщение об ошибке
}
}
}
}
}
Сорцы (VS 2008)
__________________
*********************************
*Я не волшебник ٩(๏̯͡๏)۶, только учусь...*
*********************************
Программы на заказ
Times to fly...
|
|
|