Многопоточность и синхронизация потоков C#.net

Тема в разделе ".NET", создана пользователем Real-Mulik, 7 авг 2006.

Статус темы:
Закрыта.
  1. Real-Mulik

    Real-Mulik Гость

    Как узнать сколько потоков в данный момент работает с текущим разделяемым ресурсом? Да и что вообще такое разделяемый ресурс?! Может ли он является, скажем, объектом? С помощью чего можно синхронизировать потоки (пулл или с помощью циклического опроса)? Если можно укажите плз источник где можно найти примеры.

    И как ограничить количество потоков в пуле (по умолчанию там стоит 25 и 1000)?

    Заранее благодарен.
     
  2. mr_ST

    mr_ST Гость

    Для начало почитайте что-нить про потоки и синхронизацию как таковою. Того же Рихтера "Windows для профессионалов". В контексте .NET - RTFM lock, Monitor, EventWaithandle, Mutex, Semaphore, ReaderWriterLock, Interlocked
     
  3. Real-Mulik

    Real-Mulik Гость

    Я уже прочитал все из мне доступного. Я ищю конкретный пример по ручной синхронизации потоков. В частности мне необходимо обеспечить доступ к разделяемому ресурсу сразу n потокам. Для этого необходимо как минимум считаь количестао потоков, работающих с данным ресурсом, однако ниодин конкретный метод пречисленных классов это (вроде, я может не дочитал чего) не предоставляет... Вот я и прошу помощи...
     
  4. mr_ST

    mr_ST Гость

    Зачем считать потоки? :)

    Вот наипростейший пример thread safe класса. Обращение к проперти SomeValue хоть из тысячи хоть из миллиона потоков будет безопасным.

    Код (Text):
    public class SomeClass
    {
    private int _SomeValue = 0;
    private object _SyncObject = new object();

    public int SomeValue
    {
    get
    {
    lock(_SyncObject)
    {
    return _SomeValue;
    }
    }

    set
    {
    lock(_SyncObject)
    {
    _SomeValue = value;
    }
    }
    }
    }
     
  5. NikSoft

    NikSoft Гость

    Одна из книг полностью посвященных многопоточности для .NET:

    Alan L. Dennis
    .NET Multithreading (ISBN: 1-930110-54-5)
     
  6. Real-Mulik

    Real-Mulik Гость

    Функция Lock насколько мне известно, позволяет доступ к ресурсу только одному потоку, а как сделать так, чтобы к ресурсу могли обращаться сразу несколько потоков? И при этом контролировать их количество?
     
  7. mr_ST

    mr_ST Гость

    lock не функция а оператор. Участок кода который облочен не будет выполняться в других потоках если он уже выполняется в текущем(в каком нибудь из потоков). Таким образом код будет всегда выполняться только в одном потоке. Обьясни наконец зачем тебе знать их количество.
     
  8. Real-Mulik

    Real-Mulik Гость

    Задание завучит след образом:

    Вот я и спрашиваю как сделать ресурс доступным сразу нескольким потокам.
     
  9. mr_ST

    mr_ST Гость

    Он по умолчанию доступен нескольким потокам, вернее их количество неограничено. В твоём случае, скорее всего, достаточно сделать обёртку над классом Monitor в котором ты будешь считать кол-во потоков.
     
  10. Dr.Gigabit

    Dr.Gigabit Гость

    Кстати, Рихтер сейчас консультирует одну команду Микрософт как раз по теме. Вот недавно статью написал http://msdn.microsoft.com/msdnmag/issues/0...rs/default.aspx

    Обещают сделать ассинхронное/многопоточное программирование проще :)
     
  11. Real-Mulik

    Real-Mulik Гость

    <!--QuoteBegin-mr_ST+11:08:2006, 15:13 -->
    <span class="vbquote">(mr_ST @ 11:08:2006, 15:13 )</span><!--QuoteEBegin-->сделать обёртку над классом Monitor в котором ты будешь считать кол-во потоков
    [snapback]42120" rel="nofollow" target="_blank[/snapback]​
    [/quote]
    Этот как "Обертку"? класс наследовать надо?
     
  12. mr_ST

    mr_ST Гость

    Фигли там наследовать там все методы статические. Обёртка, он же враппер он же wrapper

    Что-то типа:

    Код (Text):
    public class MyMonitor
    {
    private object _SharedResource
    int _ThreadCounter = 0;

    public MyMonitor(object sharedResource)
    {
    _SharedResource = sharedResource;    
    }

    public void Enter()
    {
    lock(this)
    {
    _ThreadCounter++;
    Monitor.Enter(_SharedResource);
    }  
    }

    public void Exit()
    {
    lock(this)
    {
    _ThreadCounter--;
    Monitor.Exit(_SharedResource);
    }  
    }
    }
    Дальше сам.
     
  13. Real-Mulik

    Real-Mulik Гость

    Понятно. А в классе Monitor есть функция, усыпляющая процесс с таймаутом?
     
  14. I_am_Robin_Hood

    I_am_Robin_Hood Гость

    будет ли вот такое решение решением именно это задачи?
    Код (Text):
    public class SynchronizingObject<T>
    {

    private volatile int threadCounter = 0;
    private T sharedResource;
    private int n;
    private int milliseccondTimeout;
    public SynchronizingObject(T sharedResource, int n, int milliseccondTimeout)
    {
    this.n = n;
    this.milliseccondTimeout = milliseccondTimeout;
    this.sharedResource = sharedResource;
    }


    public void Enter()
    {
    lock (sharedResource)
    {

    if (threadCounter == n)
    {
    Console.WriteLine(Thread.CurrentThread.Name);
    if (!Monitor.Wait(sharedResource, TimeSpan.FromMilliseconds(milliseccondTimeout)))
    {
    Thread.CurrentThread.Abort();
    }

    }
    else
    {
    threadCounter++;
    }
    }  
    }

    public void Exit()
    {
    lock (sharedResource)
    {
    threadCounter--;
    Monitor.Pulse(sharedResource);
    }  
    }

    }
    То есть синхронизация будет если тока делать вызовы Enter и Exit в конце и начале кода делегата передаваемого в качестве параметра новому потоку. Можно ли как то по другому?
     
  15. Pasha

    Pasha Гость

    Для: I_am_Robin_Hood
    Решением этой задачи является стандартный класс System.Threading.Semaphore.
     
Загрузка...
Похожие Темы - Многопоточность синхронизация потоков
  1. 123456789igor
    Ответов:
    0
    Просмотров:
    922
  2. Vadik(R)
    Ответов:
    1
    Просмотров:
    1.415
  3. sanch
    Ответов:
    2
    Просмотров:
    3.068
  4. makaset
    Ответов:
    1
    Просмотров:
    616
  5. lorpeace
    Ответов:
    0
    Просмотров:
    626
Статус темы:
Закрыта.

Поделиться этой страницей