如何唤醒暂停的线程?
How can I wake up paused thread?
如何仅使用 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;
}
pause()
函数将 return 处理任何可以捕获的信号,但您必须先设置信号处理程序并捕获该信号。
这是一个例子:
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
can be caught, but it is not designed for this, but instead to resume processes that where stopped by SIGSTOP
.
如何仅使用 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;
}
pause()
函数将 return 处理任何可以捕获的信号,但您必须先设置信号处理程序并捕获该信号。
这是一个例子:
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
can be caught, but it is not designed for this, but instead to resume processes that where stopped by SIGSTOP
.