LINUX.ORG.RU

Suspend, resume threads using posix calls only


0

0

Hello All, Задача следующая - есть поток, код которого нельзя менять(то есть добавлять или удалять строки в исходный код), необходимо реализовать операцию suspend and resume для данного потока используя только стандартные вызовы описанные в POSIX 1.x

Буду рад услышать Ваши идеи. Заранее благодарен.


Re: Suspend, resume threads using posix calls only

Есть такие идеи.

1. Посмотреть в исходники wine, как реализованы функции ResumeThread и SuspendThread.

2. Создать свою функцию из которой вызывать закрытую функцию. В своей перед вызовом закрытой установить обработчик сигнала, например SIGUSR1, который надо игнорировать в остальных потоках. В обработчике сигнала попробовать работать с обектами синхронизации. Перед посылкой сигнала захватить обект. Ну дальше, надеюсь, логика понятна. Вот только не ясно насколько это корректно, т.к. не известно, что делает рабочая функция. IMHO этот вариант очень рискованный.

kosmonavt ()
Ответ на: Re: Suspend, resume threads using posix calls only от kosmonavt

Re: Suspend, resume threads using posix calls only

в LinuxThreads нельзя использовать синхронизацию в обработчиках сигналов
там можно попробовать использовать ptrace PTRACE_ATTACH для саспенда и
PTRACE_DEATCH для resume тредов

jek_ ()
Ответ на: Re: Suspend, resume threads using posix calls only от kosmonavt

Re: Suspend, resume threads using posix calls only

Здравствуйте, Сигнал SIGSTOP просто остановит выполнение "потока", а сигнал SIGCONT продолжит с начала выполнение. Это не suspend, а скорее перезагрузка. Это не то что мне надо.

fmvin ()
Ответ на: Re: Suspend, resume threads using posix calls only от kosmonavt

Re: Suspend, resume threads using posix calls only

Привет. Ваш второй вариант я уж попробовал. Он у меня не работает. Если приложение с большой скоростью посылает suspend/resume "сигналы" данному потоку, то сигналы теряются и через некоторое время поток перестает отвечать на сигналы и остается в состоянии suspend бесконечно долго из которого его нельзя вывести ничем. А вот первый вариант я посмотрю. Интересно.

Спасибо.

fmvin ()
Ответ на: Re: Suspend, resume threads using posix calls only от jek_

Re: Suspend, resume threads using posix calls only

Здравствуйте, Это к сожалению тоже не пойдет. У меня в конечном итоге пишется конечный продукт, и механизм трайсирования не должен использоваться, как основной механизм функционирования. :(

Спасибо.

fmvin ()
Ответ на: Re: Suspend, resume threads using posix calls only от fmvin

Re: Suspend, resume threads using posix calls only

Ну тогда, боюсь, Вам уже ничего не поможет :( Wine тоже делает синхронизацию посредством сигналов. Можно использовать RT сигналы - они в некотором смысле надежнее SIGUSR#. Но в любом случае придется делать синхронизацию останова тредов, т.к. suspend/resume должны быть синхронными. А вот ее-то и нежелательно сделать в LinuxThreads... Ну хорошо, можно попробовать sem_wait, sem_post, но это опять-таки ненадежно и медленно.

Посмотрите еще реализацию SUN JVM (htpp://java.sun.com). Там можно скачать исходники.

jek_ ()
Ответ на: Re: Suspend, resume threads using posix calls only от fmvin

Re: Suspend, resume threads using posix calls only

А можно узнать что делает функция? Например, если она пишет/читает stdout/stdin, создать каналы-переходники и управлять подачей/выборкой данных в каналы и тем самым блокировать ее на запись/чтение. Есть же другие механизмы, которые могут остановить тред.

kosmonavt ()
Ответ на: Re: Suspend, resume threads using posix calls only от kosmonavt

Re: Suspend, resume threads using posix calls only

Функции не работает с железом никакаким образом, к сожалению, и запимается параллельными вычислениями. Моя задача скорее абстрактная, чем аппаратно-зависимая. :(

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