Ayr*_*rat 2 linux signals pthreads segmentation-fault
下面的程序为整个过程设置 SIG_ALRM 处理程序,创建一个线程,将 SIG_ALRM 信号发送到新创建的线程。在 SIG_ALRM 处理程序中调用 pthread_exit。结果 - 分段错误。如果你在发送信号之前睡觉 - 好的。
看起来在 pthread_exit 时刻没有启动新线程。我试图用 gdb 定位分段错误,但无法用 gdb 重现崩溃。
导致分段错误的原因是什么?
谢谢!
#include <signal.h>
#include <pthread.h>
#include <iostream>
#include <cassert>
using namespace std;
void* threadFunc(void* arg) {
cout << "thread: started. sleeping..: " << pthread_self() << endl;
sleep(10);
cout << "thread: exit" << endl;
return NULL;
}
void alrm_handler(int signo) {
cout << "alrm_handler: " << pthread_self() << endl;
pthread_exit(NULL); //if comment - no segmentation fault
}
int main() {
cout << "main: " << pthread_self() << endl;
struct sigaction act;
act.sa_handler = alrm_handler;
act.sa_flags = 0;
sigemptyset(&act.sa_mask);
sigaction(SIGALRM, &act, NULL);
pthread_t t;
int rc = pthread_create(&t, NULL, threadFunc, NULL);
assert(rc == 0);
// usleep(1000); //if Uncomment - no segmentation fault
rc = pthread_kill(t, SIGALRM);
assert(rc == 0);
pthread_join(t, NULL);
cout << "main: exit" << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
主要:140130531731232
alrm_handler:140130504095488
分段错误
pthread_exit不是异步信号安全的。除非您可以确定信号处理程序没有中断异步信号不安全函数,否则您不能从信号处理程序调用它。特别是,调用pthread_create和进入新线程的启动函数之间的时间必须被视为异步信号不安全 - 这在标准中从未明确说明,但您可以认为新线程仍然“在pthread_create”(如果您愿意,这是异步信号不安全的)。
| 归档时间: |
|
| 查看次数: |
3183 次 |
| 最近记录: |