如何唤醒暂停的线程?

时间:2018-11-10 10:22:15

标签: c pthreads pause wakeup

如何仅使用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 :(得分:0)

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停止的进程。