The OpenNET Project / Index page

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




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
HELP! pthread_kill и SIGSTOP, !*! floke, 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.

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

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

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

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

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

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

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

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

    pthread_suspend_np()/pthread_resume_np()

    • HELP! pthread_kill и SIGSTOP, !*! floke, 12:12 , 06-Апр-10 (3)

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

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


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

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

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

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

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

          Вот.

          • HELP! pthread_kill и SIGSTOP, !*! Вова, 14:25 , 06-Апр-10 (7)
            >задачи не знают о существовании менеджера, управление
            >явно они не возвращают(задача представляет из себя цикл 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() при разрешении работать.

      • HELP! pthread_kill и SIGSTOP, !*! guest, 12:49 , 06-Апр-10 (5)
        >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




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

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