URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 4558
[ Назад ]

Исходное сообщение
"pthread и что-нибудь вроде suspend() и resume()"

Отправлено impatt , 15-Авг-05 08:44 
Привет всем.
Нужно в Линуксе сделать несколько потоков и чтобы один из них мог останавливать любой другой в любой момент и мог потом разрешать ему двигаться дальше. К примеру, в JAVA есть такие функции suspend() и resume() - соответственно, остановить и продолжить поток. Кстати, остановки в заранее опреденённых в потоках местах с помощью мутексов не канают - нужно внешнее управление в произвольном месте.
Да, зачем эта вся ахинея: нужно сымитировать свой планировщик потоков, а ещё точнее, протестировать планировщик от микрооперационки для микроконтроллеров, и сделать именно собственную заморозку/разморозку потоков.
Может, найдутся у кго-нибудь хорошие мысли ?? Спасибо :)

Содержание

Сообщения в этом обсуждении
"pthread и что-нибудь вроде suspend() и resume()"
Отправлено impatt , 15-Авг-05 13:38 
Сам себе и отвечаю:
оказывается, можно функцией pthread_kill посылать соответствующие сигналы потоку. Нижеследующая программка иллюстрирует сказанное.

#include <pthread.h>
#include <unistd.h>
#include <stdio.h>
#include <signal.h>

//это отдельный поток, выполняется параллельно после его запуска функцией pthread_create()
//печатает каждую секунду сообщение и так пока программа (процесс) не завершится
void* my_t(void *hlam){
    while(1){
        sleep(1);                    //sleep 1 second
        puts("My thread is work");    //still alive :)
        }
    };
    

int main(){
    pthread_t th;                                        //дескриптор создаваемого потока
    pthread_create(&th, NULL, my_t, (void *)"none");    //создаём поток
    puts("***Thread was created***");                    //поток рождён.
    sleep(3);                                            //сон 3 секунды
    pthread_kill(th, SIGSTOP);                            //шлём сигнал "СТОП"
    puts("***Thread was suspended***");
    sleep(5);
    pthread_kill(th, SIGCONT);                            //шлём сигнал "ПРОДОЛЖИТЬ"
    puts("***Thread was resumed***");
    sleep(3);
    return 0;
    }


"pthread и что-нибудь вроде suspend() и resume()"
Отправлено Yurial , 11-Апр-08 10:21 
Note that pthread_kill() only causes the signal to be handled in the context of the given thread; the signal action (termination or stopping) affects the process as a whole. (с) man pthread_kill

Отметьте, что pthread_kill () только заставляет сигнал быть обработанным в контексте данной нити; действие сигнала (завершение или остановка) затрагивает процесс в целом. (c) promt.ru