вопросы по многопоточности
От: Monkey-Bee  
Дата: 23.07.10 20:38
Оценка:
у меня два вопроса по могопоточности — может кто подскажет.
вопрос 1) есть таймер System.Threading.Timer он генерирует тик раз в 10с, а фукция выполняется дольше — скажем 20 что произойдет? будут запускаться новые потоки пока не будет исеключение ? или будет выполняться функция 20 с и тоьлко после ее выполнения будет вызван новый тик и все повториться заово или еще вараиент.
вопрос 2) есть Monitor — он вызывается в рекурсивной функции и что произойдет — он будет перепоняться или войдет в защищенный код или ... ?
подскажите — не хочется писать код и пробовать — а то еще не то напишу, а прочитать как это работает в описаных ситуациях не нашел где
Re: вопросы по многопоточности
От: Jolly Roger  
Дата: 24.07.10 01:48
Оценка: +3
Здравствуйте, Monkey-Bee, Вы писали:

MB>подскажите — не хочется писать код и пробовать — а то еще не то напишу


А по-моему код для проверки обоих вопросов совершенно элементарный, ошибиться там просто негде
"Нормальные герои всегда идут в обход!"
Re: вопросы по многопоточности
От: SE Украина  
Дата: 24.07.10 13:37
Оценка:
Здравствуйте, Monkey-Bee, Вы писали:

MB>у меня два вопроса по могопоточности — может кто подскажет.

MB>вопрос 1) есть таймер System.Threading.Timer он генерирует тик раз в 10с, а фукция выполняется дольше — скажем 20 что произойдет? будут запускаться новые потоки пока не будет исеключение ? или будет выполняться функция 20 с и тоьлко после ее выполнения будет вызван новый тик и все повториться заово или еще вараиент.
MB>вопрос 2) есть Monitor — он вызывается в рекурсивной функции и что произойдет — он будет перепоняться или войдет в защищенный код или ... ?
MB>подскажите — не хочется писать код и пробовать — а то еще не то напишу, а прочитать как это работает в описаных ситуациях не нашел где

Признавайтесь, вам недавно задали эти вопросы на собеседовании.

Как раз возьмите и напишите код. да еще и рефлектором по унтересующим классам полазьте.
Это все практические вопросы, и лучше раз попробовать самому и быть уверенным на всю жизнь.
Re: вопросы по многопоточности
От: GreenGood  
Дата: 30.07.10 21:06
Оценка: -1
Здравствуйте, Monkey-Bee, Вы писали:

MB>у меня два вопроса по могопоточности — может кто подскажет.

MB>вопрос 1) есть таймер System.Threading.Timer он генерирует тик раз в 10с, а фукция выполняется дольше — скажем 20 что произойдет? будут запускаться новые потоки пока не будет исеключение ? или будет выполняться функция 20 с и тоьлко после ее выполнения будет вызван новый тик и все повториться заово или еще вараиент.
MB>вопрос 2) есть Monitor — он вызывается в рекурсивной функции и что произойдет — он будет перепоняться или войдет в защищенный код или ... ?
MB>подскажите — не хочется писать код и пробовать — а то еще не то напишу, а прочитать как это работает в описаных ситуациях не нашел где
1) Таймер использует пул потоков. Будут запускаться новые потоки, если они доступны в пуле иначе если максимальное количество потоков израсходовано, то запрос на выполнение будет ждать своей очереди.
2) Если при каждом вызове рекурсивной функции объект который используешь для блокировки не меняется, то соответственно нельзя будет войти в защищенный код
Re[2]: вопросы по многопоточности
От: ldarcy  
Дата: 30.07.10 21:51
Оценка:
Здравствуйте, GreenGood, Вы писали:

GG>2) Если при каждом вызове рекурсивной функции объект который используешь для блокировки не меняется, то соответственно нельзя будет войти в защищенный код


    class Program
    {
        static void Main(string[] args)
        {
            new Program().Run();
        }
        public void Run()
        {
            Monitor.Enter(this);
            Console.Write("In");
            this.Run();
            Monitor.Exit(this);
        }
    }
Re: вопросы по многопоточности
От: SergeyT. США http://sergeyteplyakov.blogspot.com/
Дата: 30.07.10 21:55
Оценка:
Здравствуйте, Monkey-Bee, Вы писали:

MB>у меня два вопроса по могопоточности — может кто подскажет.

MB>вопрос 1) есть таймер System.Threading.Timer он генерирует тик раз в 10с, а фукция выполняется дольше — скажем 20 что произойдет? будут запускаться новые потоки пока не будет исеключение ? или будет выполняться функция 20 с и тоьлко после ее выполнения будет вызван новый тик и все повториться заово или еще вараиент.
MB>вопрос 2) есть Monitor — он вызывается в рекурсивной функции и что произойдет — он будет перепоняться или войдет в защищенный код или ... ?
MB>подскажите — не хочется писать код и пробовать — а то еще не то напишу, а прочитать как это работает в описаных ситуациях не нашел где

1) Если таймер "многоразовый", то функция обработчика будет вызываться раз в 10 секунд и в этом случае функция обратного вызова будет вызываться до тех пор, пока пул потоков будет создавать новые потоки. Если таймер "одноразовый", то запуск нового таймера будет происходить только после обработки предыдущего вызова таймера, в этом случае вы потеряете периодичность (она будет плавать от 10 секунд до максимального времени выполнения вашего обработчика).

The method specified for callback should be reentrant, because it is called on ThreadPool threads. The method can be executed simultaneously on two thread pool threads if the timer interval is less than the time required to execute the method, or if all thread pool threads are in use and the method is queued multiple times.



var timer = new Timer(TimerCallback);
var period = TimeSpan.FromSecond(10);
// обработчик таймера будет вызываться через каждые 10 секунд
timer.Change(period, period);

// обработчик таймера будет вызван только один раз
timer.Change(period, TimeSpan.FromMillisecond(-1));

..
void TimerCallback()
{
  //обработчик функции обратного вызова таймера
  //какая-то бизнес-логика, которая может длиться более 10 с

  //перед выходом из функции запускаем таймер снова
  timer.Change(period, TimeSpan.FromMillisecond(-1));
}


2) Не очень понял о Monitor-е, рекурсивной фунции и защищенном коде, но может быть документация на Monitor.Enter вам поможет:

Use Enter to acquire the Monitor on the object passed as the parameter. If another thread has executed an Enter on the object but has not yet executed the corresponding Exit, the current thread will block until the other thread releases the object. It is legal for the same thread to invoke Enter more than once without it blocking; however, an equal number of Exit calls must be invoked before other threads waiting on the object will unblock.

Re[3]: вопросы по многопоточности
От: GreenGood  
Дата: 30.07.10 22:10
Оценка: +1
Здравствуйте, ldarcy, Вы писали:

L>Здравствуйте, GreenGood, Вы писали:


GG>>2) Если при каждом вызове рекурсивной функции объект который используешь для блокировки не меняется, то соответственно нельзя будет войти в защищенный код


L>
L>    class Program
L>    {
L>        static void Main(string[] args)
L>        {
L>            new Program().Run();
L>        }
L>        public void Run()
L>        {
L>            Monitor.Enter(this);
L>            Console.Write("In");
L>            this.Run();
L>            Monitor.Exit(this);
L>        }
L>    }
L>
понятно. оказывается для одного потока можно)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.