Многопоточный код
От: _ichensky Европа https://github.com/ichensky
Дата: 08.02.16 19:45
Оценка:
Здравствуйте,
Как лучше всего сделать обертку на функцией 'funс' что бы код выполнялся в порядке 1.3.2.4
Если класс 'A' и 'func' менять нельзя.

-- Task , ThreadPool — не подойдут т.к. код выпоняет "не немедленно"
-- new Thread — не пойдет, т.к. тред может висеть долго.

void main(){
    var a = new A();
    // ... код 1 
    a.func()  
    // ... код 2
}

class A {
func(){
    // ... код 3
    Thread.Sleep(100); 
    // ... код 4
}
}


Идеально подошлобы что-то вроде Task.Factory.StarNew, но чтобы таска сразу получила найвысший приоритет перед остальными тасками и если понадобиться — были приостановлены все другие таски, но по-умолчанию Task.Factory может положить таску в пул и ожидать завершения некоторых других.
Підтримати Україну у боротьбі з країною-терористом.

https://prytulafoundation.org/
https://u24.gov.ua/

Слава Збройним Силам України!!! Героям слава!!!
Re: Многопоточный код
От: artelk  
Дата: 08.02.16 21:07
Оценка:
Здравствуйте, _ichensky, Вы писали:

_>Если класс 'A' и 'func' менять нельзя.

Никак, имхо. Разве что Thread.Sleep как-то мокать, чтоб ждал на ивенте.
Re: Многопоточный код
От: Sinix  
Дата: 09.02.16 07:31
Оценка: 2 (1) +1
Здравствуйте, _ichensky, Вы писали:

_>Здравствуйте,

_>Как лучше всего сделать обертку на функцией 'funс' что бы код выполнялся в порядке 1.3.2.4
Многопоточный код по определению предлагает произвольный порядок выполнения конкурентных операций.

Нужен определённый порядок — или возитесь с примитивами синхронизации, или просто перепишите код аля
            var t1 = Task.Delay(123); 
            var t3 = Task.Delay(456);
            await Task.WhenAll(t1, t3);

            var t2 = Task.Delay(456);
            var t4 = Task.Delay(789);
            await Task.WhenAll(t2, t4);


_>Если класс 'A' и 'func' менять нельзя.

Никак, если не связываться с извращениями типа "мокнуть Thread.Sleep()". Для продакшна ни один из вариантов не годится, поэтому тратить на них время незачем.
Re: Многопоточный код
От: itslave СССР  
Дата: 09.02.16 15:16
Оценка: +1
Здравствуйте, _ichensky, Вы писали:

_>Здравствуйте,

_>Как лучше всего сделать обертку на функцией 'funс' что бы код выполнялся в порядке 1.3.2.4
_>Если класс 'A' и 'func' менять нельзя.
https://msdn.microsoft.com/ru-ru/library/system.threading.autoresetevent(v=vs.110).aspx
Все остальное — шаманство и игры с вероятностями которе могу точень больно ударить на проде и не воспроизводиться на тестовом енве.
Re[2]: Многопоточный код
От: koandrew Канада http://thingselectronic.blogspot.ca/
Дата: 10.02.16 19:26
Оценка: +2
Здравствуйте, Sinix, Вы писали:

S>Нужен определённый порядок — или возитесь с примитивами синхронизации, или просто перепишите код аля

Ну и нафига вообще тогда нужны потоки? Просто тупо вызвать их по порядку — и всего делов.
[КУ] оккупировала армия.
Re[2]: Многопоточный код
От: TK Лес кывт.рф
Дата: 10.02.16 20:41
Оценка: +1
Здравствуйте, Sinix, Вы писали:

_>>Если класс 'A' и 'func' менять нельзя.

S>Никак, если не связываться с извращениями типа "мокнуть Thread.Sleep()". Для продакшна ни один из вариантов не годится, поэтому тратить на них время незачем.

Если под Windows то, мокать Thread.Sleep не обязательно — там используется SleepEx который "alertable"
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re: зачем тебе это шаманство? (-)
От: Философ Ад http://vk.com/id10256428
Дата: 11.02.16 10:11
Оценка:
Всё сказанное выше — личное мнение, если не указано обратное.
Re: Многопоточный код
От: Albeoris  
Дата: 11.02.16 18:19
Оценка: 6 (1)
Здравствуйте, _ichensky, Вы писали:

_>Идеально подошлобы что-то вроде Task.Factory.StarNew, но чтобы таска сразу получила найвысший приоритет перед остальными тасками и если понадобиться — были приостановлены все другие таски, но по-умолчанию Task.Factory может положить таску в пул и ожидать завершения некоторых других.


Нельзя -> нет исходников? Тогда воткнуть в него через IL в рантайме любой WaitHandle (lock, wait, pulse или более высокоуровневые, типа Auto/ManualResetEvent)

Любой поток может быть засуспенден системой. А в случае .NET, ещё и GC. Поэтому как бы ты не выставлял тайминги, найдётся ситуация, в которой они дадут сбой. И тут не важно, началось их выполнение одновременно или нет.
"Хаос всегда побеждает порядок, поскольку лучше организован." (с) Терри Пратчетт
Отредактировано 11.02.2016 18:21 Albeoris . Предыдущая версия .
Re[2]: зачем тебе это шаманство? (-)
От: _ichensky Европа https://github.com/ichensky
Дата: 11.02.16 21:27
Оценка:
Здравствуйте, Философ, Вы писали:

Надо сделать приложение так что бы можно было время от времени запускать высокоприоритетный код(напр. для расчета гарфики, разной анимации) и в тоже время, приложение должно постоянно выполнять много разных задач(напр. скачивать, обрабатывать данные из инета и скидывать результат на диск).
А когда появляется высоприорететная задача(а их может быть много) надо сделать так что бы остальные задачи передавали свои кванты процессорного времени этой задаче.
Підтримати Україну у боротьбі з країною-терористом.

https://prytulafoundation.org/
https://u24.gov.ua/

Слава Збройним Силам України!!! Героям слава!!!
Re[3]: зачем тебе это шаманство? (-)
От: Albeoris  
Дата: 11.02.16 22:02
Оценка:
Здравствуйте, _ichensky, Вы писали:

_>Здравствуйте, Философ, Вы писали:


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

_>А когда появляется высоприорететная задача(а их может быть много) надо сделать так что бы остальные задачи передавали свои кванты процессорного времени этой задаче.

Ну так поступай, так как делает сборщик мусора.

Получай все потоки:
Process.GetCurrentProcess().Threads;

И приостанавливай все, кроме приоритетных:
[DllImport("kernel32.dll")]
static extern UInt32 SuspendThread(IntPtr threadHandle);
"Хаос всегда побеждает порядок, поскольку лучше организован." (с) Терри Пратчетт
Re[3]: зачем тебе это шаманство? (-)
От: TK Лес кывт.рф
Дата: 12.02.16 05:14
Оценка: +3
Здравствуйте, _ichensky, Вы писали:

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

_>А когда появляется высоприорететная задача(а их может быть много) надо сделать так что бы остальные задачи передавали свои кванты процессорного времени этой задаче.

Так, ставьте потокам разные приоритеты — они реально работают.
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.