LINUX.ORG.RU

suspend/resume thread в linux, как реализовать?


0

1

Задача следующая: есть два потока, поток A и поток B. Поток A в произвольный момент времени "усыпляем" из самого потока A, в большинстве случаев это безопасно, далее через n-ый промежуток времени(или при каких либо других обстоятельствах, условиях) из потока B "пробуждаем" поток A. В windows для этого есть соответствующие функции suspendthread и resumethread, подскажите их аналоги(точнее «легкие» реализации на C/C++) для os linux.

И еще одно между потоками A и B никакой синхронизации не происходит.

Через что потоки реализованы? Процессам можно просто слать сигналы STOP и CONT через банальный kill.

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

гугль говорит, что для настоящих потоков (которые NPTL) придется городить костыль из pthread_sigmask, pthread_kill и sigwait. Хотя в общем-то не страшно, пара функций вместо одной, зато будет работать в любом юниксе.

Пора мне выползать из криокамеры, со времен linux 2.4 слишком многое поменялось :)

nu11 ★★★★★
()

Condition variables?

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

Потоки реализуются через PTHREAD.

Какие проблемы могут возникнуть во всем приложении при использовании сигналов STOP/CONT относительно какого либо потока(процесса)?

Какие еще есть способы решения данной задачи?

chertjaga
() автор топика
Ответ на: комментарий от drull

sleep не подходит по двум причинам: поток в «спячке» может находится как больше указанного в sleep времени(завершится прежде временно), так и меньше указанного в sleep времени, тут надо будет вмешивается в рабочий поток, что не очень хорошо.

chertjaga
() автор топика

Используй блокирующие чтение/запись (сокеты, pipe и прочее зло). Тогда

Поток A в произвольный момент времени «усыпляем» из самого потока A

т.е. A повисает на чтении из трубы

через n-ый промежуток времени ... из потока B «пробуждаем» поток A

т.е. пишем в трубу из B

На блокирующем чтении поток _действительно_ засыпает.

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

>Какие проблемы могут возникнуть во всем приложении при использовании сигналов STOP/CONT относительно какого либо потока(процесса)?

этими сигналами ты заморозишь весь процесс целиком, со всеми потоками. Чем тебя sigwait не устраивает?

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

Суть в том, что «усыпление» и «пробуждение» уже существующего потока гораздо быстрее, чем создание нового потока. То есть выходит следующий тип приложения: запущено фиксированное количество потоков, и каждый поток в случае наличия работы, выполняет ее, а в случае отсутствия работы находится в спящем состоянии. Похоже на демона который слушает какой либо сокет, но в данном случае поток просто находится в спящем состоянии и по команде выполняет те или иные вычисления.

chertjaga
() автор топика

man sem_wait
man sem_post

man pthread_cond_wait
man pthread_cond_signal

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

>этими сигналами ты заморозишь весь процесс целиком, со всеми потоками. Чем тебя sigwait не устраивает?

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

chertjaga
() автор топика
Ответ на: комментарий от ttnl

>Используй блокирующие чтение/запись (сокеты, pipe и прочее зло). Тогда

для взаимодействия между потоками, это не лучший выход

chertjaga
() автор топика
Ответ на: комментарий от ttnl

Я немного позже напишу код, может тогда, что я хочу, станет более понятно.

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

А у тебя вариантов других и нету. Тебе нужен какой-нибудь блокирующий примитив. Тебе уже четыре предложили fifo, eventfd, posix ipc sems, condition vars. Я бы выбрал последний ибо из ptheads. Если будешь своё поделие обратно потрировать - для винды эта либа есть, будет совместимо на уровне исходников.

Да и вообще, усыплять потоки в любом месте его исполнение - хреновая идея by design. Должны быть некие опорные точки, в которых он может заснуть (а может и нет). Представь что ты тред саспендишь во время выполнения timeofdate например. В ядре ответ уже готов и осталось только зделать return и тут раз, и саспенд реквест. Как быть?

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

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

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

mi_estas
()

Не уверен, что понимаю вас, но может вы обратите свой взор на функции pthread_cond_wait() и pthread_cond_signal() или pthread_cond_broadcast()? Плюс, может вам стоит задуматься о создании управляющего потока?

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

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

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

> для взаимодействия между потоками, это не лучший выход

Что-то у меня складывается впечатление, что тебе нужно совсем не то, о чем ты спросил.

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

>Сигналы получают все потоки.

Как уже было сказано раньше, pthread_kill.

dmitry_vk ★★★
()

>... pthread_sigmask, pthread_kill и sigwait ...

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

Всем спасибо за идеи!

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