LINUX.ORG.RU

Потоки

 ,


1

2

Всех приветствую. Пишу программу, задумался о том чтобы сделать её многопоточной, но с потоками ниразу не работал и прежде чем учиться с ними работать, хочу узнать ответы на некоторые вопросы, чтобы знать изучать мне их или нет.
Вопросы:
1 - Насколько медленно создаются новые потоки?
2 - Можно ли создать поток в остановленном состоянии и без указания функции, а потом указать функцию которую нужно исполнить в отдельном потоке и запустить поток?
3 - Есть ли кроссплатформенная библиатека для удобной работы с потоками?

1 - Насколько медленно создаются новые потоки?

Чуть быстрее чем новый процесс.

2 - Можно ли создать поток в остановленном состоянии и без указания функции, а потом указать функцию которую нужно исполнить в отдельном потоке и запустить поток?

В общем случае - нет.

3 - Есть ли кроссплатформенная библиатека для удобной работы с потоками?

Смотря где. В C начиная с C11 есть треды, но я не слышал про реализацию этой части стандарта. Для C++ есть boost::thread и std::thread.

hateyoufeel ★★★★★ ()

Пишу программу, задумался о том чтобы сделать её многопоточной
хочу узнать ответы на некоторые вопросы, чтобы знать изучать мне их или нет

Попробуй лучше изучить Go.

mix_mix ★★★★★ ()

1. spawn_link отрабатывает молниеносно.

2.

P = spawn_link(fun() -> receive {fn, Fn, Args} -> Fn(Args) end end),
P ! {fn, fun(N) -> io:format("~w~n", [N]) end, 42}.

3. Зачем библиaтека, если есть эрланг?

nanoolinux ★★★★ ()

Есть OpenMP - хорошо поддерживается компиляторами, прост в изучении, для простых задач распараллеливания вполне работает.

tim239 ()

с потоками ниразу не работал

Тогда готовься наступить на массу совершенно неожиданных и неочевидных граблей. Для начала прочитай хотя бы про http://en.wikipedia.org/wiki/Memory_barrier и про http://en.wikipedia.org/wiki/Monitor_(synchronization)

1 - Насколько медленно создаются новые потоки?
2 - Можно ли создать поток в остановленном состоянии и без указания функции, а потом указать функцию которую нужно исполнить в отдельном потоке и запустить поток?
3 - Есть ли кроссплатформенная библиатека для удобной работы с потоками?

http://en.wikipedia.org/wiki/Thread_pool_pattern
http://stackoverflow.com/questions/19500404/how-to-create-a-thread-pool-using...

Manhunt ★★★★★ ()
Последнее исправление: Manhunt (всего исправлений: 1)

1 - Насколько медленно создаются новые потоки?

Зависит от реализации. В общем случае считай что если тебе нужно создавать больше единиц потоков в секунду ты что-то делаешь не так.

2 - Можно ли создать поток в остановленном состоянии и без указания функции, а потом указать функцию которую нужно исполнить в отдельном потоке и запустить поток?

Нет, в этом нет смысла. Но вообще можно указать функцию, которая сразу после запуска усыпит поток, и будет ждать пока снаружи не передадут функцию для выполнения.

3 - Есть ли кроссплатформенная библиатека для удобной работы с потоками?

Потоки - ядерная ипостась, поэтому библиотека тесно привязана к ядру и кроссплатформенной быть не может по определению. Но её интерфейс стандартизирован POSIX, поэтому код использующий POSIX потоки будет кроссплатформенным. Есть масса кроссплатформенных обёрток над потоками. Самая очевидная - плюсовые std::thread.

slovazap ★★★★★ ()

Пишу программу, задумался о том чтобы сделать её многопоточной

А зачем? Ты уверен, что это даст профит?

Harald ★★★★★ ()

mix_mix

Попробуй лучше изучить Go.


nanoolinux

spawn_link отрабатывает молниеносно.


Я специально не указывал ЯП на котором пишу, чтобы было понятно, что меня не интересует конкретные реализации на определенных языках, а интересует возможность реализации этих действий на уровне системных вызовов.

Taetricus ()
Ответ на: комментарий от unt1tled

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

Taetricus ()
Ответ на: комментарий от reprimand

c11 уже вроде как implemented

Не полностью. Треды находятся в дополнении, на которое всем плевать. По крайней мере в gcc 4.9 их нет.

hateyoufeel ★★★★★ ()
Ответ на: комментарий от Taetricus

интересует возможность реализации этих действий на уровне системных вызовов.

Таненбаум. «Операционные системы» - сразу даст тебе понимание , что такое и потоки и примитивы синхронизации.

а дальше уже мануалы по конкретным системам и нюансы реализации

Deleted ()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от Taetricus

на уровне системных вызовов.

Ну так man clone тогда. Ну и man futex до кучи.

nanoolinux ★★★★ ()
Ответ на: комментарий от hateyoufeel

Не полностью. Треды находятся в дополнении, на которое всем плевать.

очень жаль :(
пойду посмотрю как там у clang дела с этим...

reprimand ★★★★★ ()
Ответ на: комментарий от Taetricus

возможность реализации этих действий на уровне системных вызовов

Дёргается сисколл clone с CLONE_THREAD, но наверное это не то, что ты хотел знать. Тебе же предлагают изучить на порядок более продвинутую практику использования зелёных потоков (как в уже предложенных go и erlang).

mix_mix ★★★★★ ()
Ответ на: комментарий от Manhunt

У меня даже мыслей не было, что все будет гладко и без граблей.

Taetricus ()
Ответ на: комментарий от slovazap

Зависит от реализации. В общем случае считай что если тебе нужно создавать больше единиц потоков в секунду ты что-то делаешь не так.


Задачи в нескорых местах в теории могут быть сильно распаралеленны, потоки в одно и тоже место не записывают, но нескорые могут читать с одного места, в зависимости от входных данных потоков может быть вплоть до 1000, поэтому я и задал 2-й вопрос предполагая, что новые потоки создаются медленно.

Но вообще можно указать функцию, которая сразу после запуска усыпит поток, и будет ждать пока снаружи не передадут функцию для выполнения.


Это уже вселяет надежду.

Taetricus ()
Ответ на: комментарий от Harald

В данный момент профита особого не будет, но учитывая нарастание количества ядер и процессоров в ПК и мобилках, есть смысл её расспаралелить, если я её сейчас допишу как однопоточное приложение, то в будущем чтобы её расспаралеливать придется приложить гораздо больше усилий.

Taetricus ()
Ответ на: комментарий от tim239

для простых задач распараллеливания вполне работает.

Не для простых задач, а для всего. Вменяемых аналогов на сегодняшний момент нет вообще.

Dron ★★★★★ ()
Ответ на: комментарий от reprimand

А толку?

Thread model: posix
gcc version 4.9.2 (Debian 4.9.2-4) 
dron@gnu:~$ 
Dron ★★★★★ ()
Ответ на: комментарий от mix_mix

зелёных потоков


Мне потоки нужны для увеличения производительности на многопроцессорных системах, а зеленые потоки не для этого созданы.

Taetricus ()
Ответ на: комментарий от Taetricus

данных потоков может быть вплоть до 1000,

проблемы начинаются намного позже. 1000 потоков это даже 10 лет назад не было проблемой.

pef-secure ()
Ответ на: комментарий от korvin_

++

лучший из возможных ответ на просьбу изучить Go )

next_time ★★★★ ()

Ты сначала определись, какого параллелизма тебе хочется: по данным, или функционального. Если по данным, то используй всякие parallel_for из tbb или OpenMP. Если ты хочешь функционального параллелизма, то тебе помогут std::thread, boost::thread, QThread

EugeneBas ★★ ()
Ответ на: комментарий от Taetricus

а зеленые потоки не для этого созданы

В том числе и для этого, продолжай изучать.

mix_mix ★★★★★ ()

Все спасибо за ответы. Ответом стали: man clone, man futex, NPTL

Taetricus ()
Ответ на: комментарий от Taetricus

Задачи в нескорых местах в теории могут быть сильно распаралеленны, потоки в одно и тоже место не записывают, но нескорые могут читать с одного места, в зависимости от входных данных потоков может быть вплоть до 1000, поэтому я и задал 2-й вопрос предполагая, что новые потоки создаются медленно.

Количество потоков должно зависеть от количества ядер, а не от входных данных.

slovazap ★★★★★ ()
Ответ на: комментарий от Taetricus

Все спасибо за ответы. Ответом стали: man clone, man futex, NPTL

Ты просил кроссплатформенное. Перечисленное - линуксня.

slovazap ★★★★★ ()
Ответ на: комментарий от Taetricus

Мне потоки нужны для увеличения производительности на многопроцессорных системах, а зеленые потоки не для этого созданы.

При нормальной реализации (не как в пистоне) green threads мапятся на os threads как M к N.

hateyoufeel ★★★★★ ()
Ответ на: комментарий от slovazap

Так для работы с ними используется glibc, которая является кроссплатформенной, или нет?

Taetricus ()
Ответ на: комментарий от Taetricus

Вот glibc - да, кроссплатформенный. Но на других системах он использует другие реализации потоков.

slovazap ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.