LINUX.ORG.RU

Suspend, resume threads using posix calls only


0

0

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

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


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

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

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

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

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

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

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

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

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

Спасибо.

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

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

Спасибо.

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

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

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

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

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

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

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

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