Привет всем.
Нужно в Линуксе сделать несколько потоков и чтобы один из них мог останавливать любой другой в любой момент и мог потом разрешать ему двигаться дальше. К примеру, в JAVA есть такие функции suspend() и resume() - соответственно, остановить и продолжить поток. Кстати, остановки в заранее опреденённых в потоках местах с помощью мутексов не канают - нужно внешнее управление в произвольном месте.
Да, зачем эта вся ахинея: нужно сымитировать свой планировщик потоков, а ещё точнее, протестировать планировщик от микрооперационки для микроконтроллеров, и сделать именно собственную заморозку/разморозку потоков.
Может, найдутся у кго-нибудь хорошие мысли ?? Спасибо :)
Сам себе и отвечаю:
оказывается, можно функцией 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;
}
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