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

  • Автор темы Real-Mulik
  • Дата начала
Статус
Закрыто для дальнейших ответов.
R

Real-Mulik

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

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

Заранее благодарен.
 
M

mr_ST

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

Real-Mulik

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

mr_ST

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

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

Код:
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;
}
}
}
}
 
N

NikSoft

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

Alan L. Dennis
.NET Multithreading (ISBN: 1-930110-54-5)
 
R

Real-Mulik

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

mr_ST

Гость
#7
Функция Lock насколько мне известно, позволяет доступ к ресурсу только одному потоку, а как сделать так, чтобы к ресурсу могли обращаться сразу несколько потоков? И при этом контролировать их количество?
lock не функция а оператор. Участок кода который облочен не будет выполняться в других потоках если он уже выполняется в текущем(в каком нибудь из потоков). Таким образом код будет всегда выполняться только в одном потоке. Обьясни наконец зачем тебе знать их количество.
 
R

Real-Mulik

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

Написать объект синхронизации, который позволяет доступ к разделяемому ресурсу не более чем n потокам одновременно. Объект должен предоставлять возможность получить доступ к ресурсу (с заданный таймаутом и без него) и освободить ресурс. При попытке получить доступ к ресурсу в случае занятости ресурса, поток блокируется до тех пор пока хотя бы один из потоков не освободит ресурс или не наступит таймаут.
Вот я и спрашиваю как сделать ресурс доступным сразу нескольким потокам.
 
M

mr_ST

Гость
#9
Задание завучит след образом:
Вот я и спрашиваю как сделать ресурс доступным сразу нескольким потокам.
Он по умолчанию доступен нескольким потокам, вернее их количество неограничено. В твоём случае, скорее всего, достаточно сделать обёртку над классом Monitor в котором ты будешь считать кол-во потоков.
 
D

Dr.Gigabit

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

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

Real-Mulik

Гость
#11
<!--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]
Этот как "Обертку"? класс наследовать надо?
 
M

mr_ST

Гость
#12
Этот как "Обертку"? класс наследовать надо?
Фигли там наследовать там все методы статические. Обёртка, он же враппер он же wrapper

Что-то типа:

Код:
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);
}  
}
}
Дальше сам.
 
R

Real-Mulik

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

I_am_Robin_Hood

Гость
#14
будет ли вот такое решение решением именно это задачи?
Код:
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 в конце и начале кода делегата передаваемого в качестве параметра новому потоку. Можно ли как то по другому?
 
Статус
Закрыто для дальнейших ответов.