• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

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

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

Real-Mulik

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

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

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

mr_ST

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

Real-Mulik

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

mr_ST

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

Вот наипростейший пример 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

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

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

Real-Mulik

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

mr_ST

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

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

Real-Mulik

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

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

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

mr_ST

Задание завучит след образом:
Вот я и спрашиваю как сделать ресурс доступным сразу нескольким потокам.

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

Dr.Gigabit

Кстати, Рихтер сейчас консультирует одну команду Микрософт как раз по теме. Вот недавно статью написал

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

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

mr_ST

Этот как "Обертку"? класс наследовать надо?
Фигли там наследовать там все методы статические. Обёртка, он же враппер он же 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

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

I_am_Robin_Hood

будет ли вот такое решение решением именно это задачи?
Код:
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 в конце и начале кода делегата передаваемого в качестве параметра новому потоку. Можно ли как то по другому?
 
P

Pasha

Для: I_am_Robin_Hood
Решением этой задачи является стандартный класс .
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!