Все способы создания потока (8 основных)
От: -rsdn- Беларусь http://dsalodki.wix.com/resume
Дата: 10.06.15 14:05
Оценка: 4 (1)
кажется я знаю 3-4:
делегаты (асинхронный BeginInvoke и синхронный Invoke)
Thread.Start()
TreadPool.QueueUserWorkItem()
Re: Все способы создания потока (8 основных)
От: andrey82  
Дата: 10.06.15 14:12
Оценка:
Здравствуйте, -rsdn-, Вы писали:

R>кажется я знаю 3-4:

R>...

Именно способы создания потока или вообще параллельного выполнения кода? (в новом созданном потоке, в потоке, взятом из пула, Task<>, async/await, ...)
Re: Все способы создания потока (8 основных)
От: koodeer  
Дата: 10.06.15 14:15
Оценка:
Здравствуйте, -rsdn-, Вы писали:

R>кажется я знаю 3-4:

R>делегаты (асинхронный BeginInvoke и синхронный Invoke)
R>Thread.Start()
R>TreadPool.QueueUserWorkItem()

Timer'ы по тику могут выполнять задачи в потоках. Хотя обычно они берутся из пула.
Под вопросом: Task.Run, Task.Factory.StartNew.
Re[2]: Все способы создания потока (8 основных)
От: another_coder Россия  
Дата: 10.06.15 14:19
Оценка:
Здравствуйте, koodeer, Вы писали:

K>Под вопросом: Task.Run, Task.Factory.StartNew.


Эти берут потоки из пула. Под вопросом что-то иное?
Re: Все способы создания потока (8 основных)
От: TK Лес кывт.рф
Дата: 10.06.15 14:23
Оценка: +1
Здравствуйте, -rsdn-, Вы писали:

R>кажется я знаю 3-4:

R>делегаты (асинхронный BeginInvoke и синхронный Invoke)
R>Thread.Start()
R>TreadPool.QueueUserWorkItem()

1. Вы путаете создание потока и отправку задания в очередь.
2. BeginInvoke это просто интерфейс (может выполнится асинхронно, а может и синхронно) — его асинхронность это ваш домысел без какой-либо гарантии.
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[3]: Все способы создания потока (8 основных)
От: koodeer  
Дата: 10.06.15 14:25
Оценка:
Здравствуйте, another_coder, Вы писали:

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


K>>Под вопросом: Task.Run, Task.Factory.StartNew.


_>Эти берут потоки из пула. Под вопросом что-то иное?


С опцией TaskCreationOptions.LongRunning будет создаваться новый поток.
Re[2]: Все способы создания потока (8 основных)
От: -rsdn- Беларусь http://dsalodki.wix.com/resume
Дата: 10.06.15 14:33
Оценка:
Здравствуйте, TK, Вы писали:

TK>Здравствуйте, -rsdn-, Вы писали:


R>>кажется я знаю 3-4:

R>>делегаты (асинхронный BeginInvoke и синхронный Invoke)
R>>Thread.Start()
R>>TreadPool.QueueUserWorkItem()

TK>1. Вы путаете создание потока и отправку задания в очередь.

TK>2. BeginInvoke это просто интерфейс (может выполнится асинхронно, а может и синхронно) — его асинхронность это ваш домысел без какой-либо гарантии.

соглашусь, я ведь писал 3-4 , т к не уверен можно ли разделить sync/async
Re[2]: Все способы создания потока (8 основных)
От: -rsdn- Беларусь http://dsalodki.wix.com/resume
Дата: 10.06.15 14:34
Оценка:
Здравствуйте, andrey82, Вы писали:

A>Здравствуйте, -rsdn-, Вы писали:


R>>кажется я знаю 3-4:

R>>...

A>Именно способы создания потока или вообще параллельного выполнения кода? (в новом созданном потоке, в потоке, взятом из пула, Task<>, async/await, ...)


я всего лишь попросил вопросы к собеседованию = что дали с тем и разбираюсь, больше чем в топике сказать не могу
Re: Все способы создания потока (8 основных)
От: Sinix  
Дата: 10.06.15 14:51
Оценка: 6 (3) +1
Здравствуйте, -rsdn-, Вы писали:

R>кажется я знаю 3-4:


Их всего два. Или вручную — ч/з Thread
Или неявно — 'это к ThreadPool.

Для неявного есть куча частных случаев — таски, Delegate.BeginInvoke(), completion callbacks для io-операций (от таймеров и до веб-запросов), Rx, операции с SyncContext и прочая. Причём для половины из этих способов есть шанс, что код по факту новый поток (Thread) создан не будет.

Хочется экзотики — велкам в AsyncCodeActivity в WF, wcf concurrency, хаки с wpf render thread, finalizer thread, MTA COM + native thread, appdomain unload, [DebuggerDisplay] для выполнения в потоке отладчика etc etc etc.
Re: Все способы создания потока (8 основных)
От: SergeyT. США http://sergeyteplyakov.blogspot.com/
Дата: 10.06.15 16:50
Оценка: 4 (2) +2
Здравствуйте, -rsdn-, Вы писали:

R>кажется я знаю 3-4:

R>делегаты (асинхронный BeginInvoke и синхронный Invoke)
R>Thread.Start()
R>TreadPool.QueueUserWorkItem()

Не с собеседования ли вопрос?

Многие интервьюеры по наивности задают подобный вопрос именно в такой формулировке. Но, как правильно написали выше, она не корректно звучит, ведь по сути, если не уточнять, что такое "поток", то ответить на этот вопрос вообще нельзя. Если же уточнить (что это поток ОС-ки или CLR), то мы скатимся к тому, что останется лишь один вариант ответа.

Именно поэтому, корректный вопрос должен звучать так:
Сколько вы знаете способов выполнить некоторую операцию (представленную, например, методом) асинхронно.

И тут поехали уже вариации на тему:

— Создать поток вручную
— Использовать классический пул потоков с помощью ThreadPool.QueueUserWorkItem
— Таски: Task.Run, Task.Factory.StartNew (с вариациями на тему LongRunning или нет).
— Delegate.BeginInvoke
— BackgroundWorker

Но, по сути, ответ на вопрос сводится к тому, что мы можем создать поток вручную или воспользоваться некоторой дополнительной абстракцией, которая будет отвечать за более эффективное использование потоков. При этом абстракция может быть прибита к среде исполнения, как в случае со стандартным пулом потоков (и ее тюнингованной версией для работы с тасками), на уровне стандартной библиотеки (Delegate.BeginInvoke) или на уровне FCL (BackgroundWoker, который уже использовать смысла-то нет).

Обычно после этого должен следовать еще и такой вопрос: А когда чем лучше пользоваться? Когда есть смысл создавать поток вручную, а когда с использовать пул потоков. Или еще более тонкий: а в чем разница между ThreadPool.QueueUserWorkItem и Task.Run (при учете, что таска не LongRunning)?.
Re[2]: Все способы создания потока (8 основных)
От: -rsdn- Беларусь http://dsalodki.wix.com/resume
Дата: 10.06.15 17:42
Оценка:
Здравствуйте, SergeyT., Вы писали:

ST>Здравствуйте, -rsdn-, Вы писали:


R>>кажется я знаю 3-4:

R>>делегаты (асинхронный BeginInvoke и синхронный Invoke)
R>>Thread.Start()
R>>TreadPool.QueueUserWorkItem()

ST>Не с собеседования ли вопрос?


ST>Многие интервьюеры по наивности задают подобный вопрос именно в такой формулировке. Но, как правильно написали выше, она не корректно звучит, ведь по сути, если не уточнять, что такое "поток", то ответить на этот вопрос вообще нельзя. Если же уточнить (что это поток ОС-ки или CLR), то мы скатимся к тому, что останется лишь один вариант ответа.


ST>Именно поэтому, корректный вопрос должен звучать так:

ST>Сколько вы знаете способов выполнить некоторую операцию (представленную, например, методом) асинхронно.

ST>И тут поехали уже вариации на тему:


ST>- Создать поток вручную

ST>- Использовать классический пул потоков с помощью ThreadPool.QueueUserWorkItem
ST>- Таски: Task.Run, Task.Factory.StartNew (с вариациями на тему LongRunning или нет).
ST>- Delegate.BeginInvoke
ST>- BackgroundWorker

ST>Но, по сути, ответ на вопрос сводится к тому, что мы можем создать поток вручную или воспользоваться некоторой дополнительной абстракцией, которая будет отвечать за более эффективное использование потоков. При этом абстракция может быть прибита к среде исполнения, как в случае со стандартным пулом потоков (и ее тюнингованной версией для работы с тасками), на уровне стандартной библиотеки (Delegate.BeginInvoke) или на уровне FCL (BackgroundWoker, который уже использовать смысла-то нет).


ST>Обычно после этого должен следовать еще и такой вопрос: А когда чем лучше пользоваться? Когда есть смысл создавать поток вручную, а когда с использовать пул потоков. Или еще более тонкий: а в чем разница между ThreadPool.QueueUserWorkItem и Task.Run (при учете, что таска не LongRunning)?.


Да с собеседования.
плохо помню, но мне сказали как-то что Thread желательно не использовать, ThreadPool лучше, но там у всех приоритет background, Task — вообще тема — т. к. там есть событие завершения (и свойство состояния). BackgroundWorker вообще не помню, Delegate — там же есть и Multicast но он же по сути и самый нужный. Вот такое смутное представление у меня.
Re[2]: Все способы создания потока (8 основных)
От: Sinix  
Дата: 10.06.15 19:04
Оценка: 1 (1)
Здравствуйте, SergeyT., Вы писали:

ST> Или еще более тонкий: а в чем разница между ThreadPool.QueueUserWorkItem и Task.Run (при учете, что таска не LongRunning)?.

С учётом вот этого — оччень тонко
Re[3]: Все способы создания потока (8 основных)
От: Vladek Россия Github
Дата: 11.06.15 07:03
Оценка: 4 (1)
Здравствуйте, another_coder, Вы писали:

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


K>>Под вопросом: Task.Run, Task.Factory.StartNew.


_>Эти берут потоки из пула.


Где скажет планировщик (TaskScheduler), там и берут.
Re[3]: Все способы создания потока (8 основных)
От: koodeer  
Дата: 11.06.15 07:12
Оценка:
Здравствуйте, another_coder, Вы писали:

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


K>>Под вопросом: Task.Run, Task.Factory.StartNew.


_>Эти берут потоки из пула. Под вопросом что-то иное?


Написав "под вопросом" я имел в виду, что Task.Run запускает всё-таки задачу, а не поток. В текущей реализации Task реализован поверх Thread. Однако, где-то в документации упомянуто, что на это нельзя закладываться, потому что в будущих версиях дотнета это может быть изменено. Например, введут зелёные потоки и Task'и могут быть сделаны поверх них.
Re[2]: Все способы создания потока (8 основных)
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 11.06.15 07:46
Оценка:
Здравствуйте, Sinix, Вы писали:

S>Здравствуйте, -rsdn-, Вы писали:


R>>кажется я знаю 3-4:


S>Их всего два. Или вручную — ч/з Thread

S>Или неявно — 'это к ThreadPool.

S>Для неявного есть куча частных случаев — таски, Delegate.BeginInvoke(), completion callbacks для io-операций (от таймеров и до веб-запросов), Rx, операции с SyncContext и прочая. Причём для половины из этих способов есть шанс, что код по факту новый поток (Thread) создан не будет.


S>Хочется экзотики — велкам в AsyncCodeActivity в WF, wcf concurrency, хаки с wpf render thread, finalizer thread, MTA COM + native thread, appdomain unload, [DebuggerDisplay] для выполнения в потоке отладчика etc etc etc.


Кстати а где используется функционал файберов Процессы, потоки выполнения ядра, пользовательские потоки и файберы

Понятно, что многие вкусности файберов отняли реализация yield
и солнце б утром не вставало, когда бы не было меня
Re[3]: Все способы создания потока (8 основных)
От: Sinix  
Дата: 11.06.15 08:06
Оценка: 4 (1)
Здравствуйте, Serginio1, Вы писали:

S> Кстати а где используется функционал файберов?

Fibers как часть системного API не взлетели по куче причин. Основная: во всех нормальных фреймворках уже есть (хотя бы как proof of concept) примерно аналогичная реализация поверх пула системных потоков. Что важно — кроссплатформенная. Что ещё более важно — заточенная под нюансы языка/фреймворка.

S> Понятно, что многие вкусности файберов отняли реализация yield

Может, речь про await + TPL?

yield (если мы про шарповский) к зелёным потокам имеет такое же отношение, как картошка к апельсинам. Т.е. есть блюда, где они вместе встречаются, но это из разряда экзотики.
Re[4]: Все способы создания потока (8 основных)
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 11.06.15 08:23
Оценка:
Здравствуйте, Sinix, Вы писали:

S>> Понятно, что многие вкусности файберов отняли реализация yield

S>Может, речь про await + TPL?

S>yield (если мы про шарповский) к зелёным потокам имеет такое же отношение, как картошка к апельсинам. Т.е. есть блюда, где они вместе встречаются, но это из разряда экзотики.

Я к тому, что файберы было удобно для выполнения рекурсивного кода с остановкой для получения данных Implementing Coroutines for .NET by Wrapping the Unmanaged Fiber API
и солнце б утром не вставало, когда бы не было меня
Re[5]: Все способы создания потока (8 основных)
От: Sinix  
Дата: 11.06.15 08:37
Оценка: +1
Здравствуйте, Serginio1, Вы писали:

S> Я к тому, что файберы было удобно для выполнения рекурсивного кода с остановкой для получения данных.

Вы только что описали await

Для полной красоты нужна поддержка языком IAsyncEnumerable или Rx, но это уже мелочи. Всяко проще, чем протащить концепцию фиберов в CLI VES.
Re[4]: Все способы создания потока (8 основных)
От: another_coder Россия  
Дата: 11.06.15 08:58
Оценка:
Здравствуйте, Vladek, Вы писали:

V>Где скажет планировщик (TaskScheduler), там и берут.


Случайный образом? Предвидеть никак нельзя?
Re[5]: Все способы создания потока (8 основных)
От: Vladek Россия Github
Дата: 11.06.15 10:21
Оценка: +1
Здравствуйте, another_coder, Вы писали:

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


V>>Где скажет планировщик (TaskScheduler), там и берут.


_>Случайный образом? Предвидеть никак нельзя?


Можно, ты же можешь поменять планировщик или вообще написать своего. Планировщик по умолчанию работает с пулом потоков.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.