The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"HELP! pthread_kill и SIGSTOP"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (C/C++)
Изначальное сообщение [ Отслеживать ]

"HELP! pthread_kill и SIGSTOP"  +/
Сообщение от floke email(ok) on 05-Апр-10, 22:53 
Имеем freebsd 8.0 + netbeans+gсс+gdb6.6
Простая задача: есть 2 функции, каждая из которых запускается в своём потоке. В функциях - бесконечный цикл выводит каждую секунду сообщение на экран. Функции пускаем в отдельных потоках и пытаемся запускать их поочередно, управляя запуском из main. Проблема в том, что при попытке сделать pthread_kill(pthread1,SIGSTOP) (этим я пытаюсь усыпить дочерний поток, чтобы после запустить сигналом SIGCONT) в режиме отладчика, вылетает окно с Signal received: SIGSTOP (Stopped (signal)). Пытаюсь продолжить - программа завершается в IDE, однако висит в диспетчере ОС. Ощущение, что тормозится основной поток, а не дочерний. На этом же форуме приводили рабочий код:

https://www.opennet.ru/openforum/vsluhforumID9/4558.html

У меня он не работает. Всё сыпится на pthread_kill. Гугль ответов не дал, хотя аналогичные вопросы я видел. Может кто сталкивался с подобной проблемой? Есть ли другой способ усыпить дочерний поток из основного? Наверное есть, но в какую сторону копать? В си пишу неделю.
Кстати, внутренность функции в дочерних потоках трогать нельзя, нужно именно управлять потоками из main.

Высказать мнение | Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "HELP! pthread_kill и SIGSTOP"  +/
Сообщение от svn (??) on 06-Апр-10, 08:57 
>в режиме отладчика, вылетает окно с Signal received: SIGSTOP (Stopped (signal)).
>Пытаюсь продолжить - программа завершается в IDE, однако висит в диспетчере
>ОС. Ощущение, что тормозится основной поток, а не дочерний.

Не бывает основных и дочерних потоков. Это не процессы. Все потоки равны, и исполняются в контексте процесса. И сигналы обрабатываются в контексте процесса. Получен сигнал STOP - останавливается весь процесс. Сигналы обрабатываются процессом, вместо работы какого-то потока, но в контексте процесса, и оказывая влияние на весь процесс.

netbeans не умеет отлаживать программы использующие сигналы. Пользуйся eclipse+cdt.

>же форуме приводили рабочий код:
>https://www.opennet.ru/openforum/vsluhforumID9/4558.html
>У меня он не работает. Всё сыпится на pthread_kill. Гугль ответов не
>дал, хотя аналогичные вопросы я видел. Может кто сталкивался с подобной
>проблемой? Есть ли другой способ усыпить дочерний поток из основного?

Нет. Есть только способы аварийного завершения потока из другого, при которых утекает память. Код не может работать так как использует особенности реализации linuxthreads, которые уже RIP.

>Кстати, внутренность функции в дочерних потоках трогать нельзя, нужно именно управлять потоками
>из main.

Бред. Это управлять асинхронно потоком нельзя из других потоков.

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

2. "HELP! pthread_kill и SIGSTOP"  +/
Сообщение от guest email(??) on 06-Апр-10, 10:30 
>У меня он не работает. Всё сыпится на pthread_kill. Гугль ответов не
>дал, хотя аналогичные вопросы я видел. Может кто сталкивался с подобной
>проблемой? Есть ли другой способ усыпить дочерний поток из основного? Наверное
>есть, но в какую сторону копать? В си пишу неделю.

pthread_suspend_np()/pthread_resume_np()

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

3. "HELP! pthread_kill и SIGSTOP"  +/
Сообщение от floke email(ok) on 06-Апр-10, 12:12 

Тогда как решить вот такую задачу: Есть 5 задачи, 1 - менеджер вытесняющей многозадачности, 2-5- бесконечные циклы(задачи собственно). Менеджер поочередно запускает задачи , при этом они ничего не знают о существовании друг друга и о механизме многозадачности. Использовать потоки обязательно.Задача должна отработать отведенное менеджером время, после чего должна запускаться другая и так по кругу.

pthread_suspend_np()/pthread_resume_np() - из man This function is a non-portable Realtime Linux extension. У меня не Linux, соответствующей библиотеки и функции я не нашел.


Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

4. "HELP! pthread_kill и SIGSTOP"  +/
Сообщение от svn (??) on 06-Апр-10, 12:36 
Если потоки всегда запущены, их переключение  осуществляет планировщик операцинной системы. Менеджер для этого не нужен.

Или пиши для чего на самом деле нужен менеджер ))

PS: в BSD вроде как есть pthread_suspend_np()/pthread_resume_np()

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

6. "HELP! pthread_kill и SIGSTOP"  +/
Сообщение от floke (ok) on 06-Апр-10, 14:02 
>Если потоки всегда запущены, их переключение  осуществляет планировщик операцинной системы. Менеджер
>для этого не нужен.
>
>Или пиши для чего на самом деле нужен менеджер ))
>
>PS: в BSD вроде как есть pthread_suspend_np()/pthread_resume_np()

Будете смеяться, но нужно сымитировать вытесняющую многозадачность. Лаба в универе. Менеджер представляет собой планировщик ОС. Сам понимаю, что имитация липовая, но не я придумываю задания)). В задании сказано использовать многопоточность путем запуска задач в отдельных нитках. Какая задача будет активна в следующий момент времени - решает менеджер. Задача должна отработать какое то заранее известное время(пара секунд), после чего менеджер должен остановить её и запустить следующую. В соответствии с механизмос вытесняющей многозадачности, задачи не знают о существовании менеджера, управление явно они не возвращают(задача представляет из себя цикл do{.....}while(1)). Менеджер пускает задачи по кругу.

Вот.

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

7. "HELP! pthread_kill и SIGSTOP"  +/
Сообщение от Вова on 06-Апр-10, 14:25 
>задачи не знают о существовании менеджера, управление
>явно они не возвращают(задача представляет из себя цикл do{.....}while(1)). Менеджер пускает задачи по кругу.

в случае действительно независимых от менеджера нитей единственным решением данной задачи будет использование политик планирования - man pthread_attr_setschedpolicy(), в текущем состоянии они позволяют эффективно блокировать любой поток приложения (и даже любой процесс стандартной политики планирования - то есть фактически любой другой процесс любого написанного в данный момент приложения на любой промежуток времени). С помощью политик я как-то написал дивную утилиту блокирования/деблокирования процессов в системе.

Если же всё-таки можно модифицировать нить, то надо делать что-то типа в псевдокоде

get_mutex_lock(thread_self());
do{
    if(state == WAIT)
            mutex_wait_condition(thread_self()).wait();
...}while1()  в нитях, и соответственно  get_mutex_lock(thread_id); при попытке останова потока, затем  mutex_wait_condition(thread_id).wake() при разрешении работать.

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

5. "HELP! pthread_kill и SIGSTOP"  +/
Сообщение от guest email(??) on 06-Апр-10, 12:49 
>pthread_suspend_np()/pthread_resume_np() - из man This function is a non-portable Realtime Linux extension.
>У меня не Linux, соответствующей библиотеки и функции я не нашел.
>

Да, не портабильно о чем явно говорит суффикс в имени функций)))
во freebsd (равно как в open и net) эти функции есть.
Но как вам уже сказали, такая техника не красива, например код на который
вы ссылаетесь (https://www.opennet.ru/openforum/vsluhforumID9/4558.html)
c высокой вероятностью повесит _все_ нитки если suspend() произойдет в момент вызова puts

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

8. "HELP! pthread_kill и SIGSTOP"  +/
Сообщение от floke email(ok) on 06-Апр-10, 14:30 
Тогда как быть?
и где тогда можно отыскать эти функции для Си?
на #include <rtl_sched.h> ругется netbeans , кричит, что нет такого... Кажется, я чего то не понимаю))
Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

9. "HELP! pthread_kill и SIGSTOP"  +/
Сообщение от guest email(??) on 06-Апр-10, 15:04 
#include <pthread_np>


Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

10. "HELP! pthread_kill и SIGSTOP"  +/
Сообщение от floke email(ok) on 06-Апр-10, 15:35 
Заработало. Сделал через pthread_suspend_np()/pthread_resume_np(), для задания вполне сгодилось. Надо будет ещё покопать на счет атрибутов и mutex, заинтересовало. Огромное человеческое спасибо всем за помощь, несколько дней подряд парился над двумя строчками. Слава opennet'у ))
Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру