Показать сообщение отдельно

  #8  
Старый 10.01.2010, 12:33
W!z@rD
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 
"";
                try
                {
                    
rwl.EnterReadLock();
                    
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 
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...
 
Ответить с цитированием