Как я могу разбудить приостановленную нить? - PullRequest
0 голосов
/ 10 ноября 2018

Как я могу разбудить приостановленную нить, используя только signal () или pthread_kill ()?

Я думаю, что приостановленная нить должна получить какие-то сигналы для активации, но я не знаю, какой сигнал нужно отправить в приостановленную нить.

// Мой терминал

USER32@myLaptop:~/list$ gcc -o ./temp ./temp.c -lpthread

USER32@myLaptop:~/list$ ./temp

Starting Thread...

// Мои коды

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

pthread_t tid;

void *thread_function(void *data){
    tid = pthread_self();
    write(STDOUT_FILENO, "Starting Thread...\n", sizeof("Starting Thread...\n"));
    pause();
    write(STDOUT_FILENO, "Success!\n", sizeof("Success!\n"));
}

int main(){
    pthread_t pth;
    pthread_create(&pth, NULL, &thread_function, NULL);

    sleep(1);

    pthread_kill(tid, SIGCONT);

    pthread_join(pth, NULL);
    return 0;
}

1 Ответ

0 голосов
/ 10 ноября 2018

Функция pause() вернет любой сигнал, который может быть перехвачен, но вы должны сначала настроить обработчик сигнала и перехватить этот сигнал.

Вот пример:

void signal_handler(int sig) {
    printf("Caught signal %d\n", sig);
}

void *thread_function(void *data) {
    signal(SIGUSR1, signal_handler);
    //rest of your code here
}

int main() {
    ...
    sleep(1);
    pthread_kill(tid, SIGUSR1);
    ...
}

SIGUSR1 является одним из сигналов, зарезервированных для внутреннего использования приложениями, поэтому он подходит для этого случая.

SIGCONT можно перехватить, но он не предназначен для этого, а вместо этого возобновляет процессы, которые были остановлены с помощью SIGSTOP.

...