gpt4 book ai didi

linux - 信号处理程序中的 pthread_exit 导致段错误

转载 作者:太空狗 更新时间:2023-10-29 11:39:41 27 4
gpt4 key购买 nike

下面的程序为整个进程设置 SIG_ALRM 处理程序,创建一个线程,向新创建的线程发送 SIG_ALRM 信号。在 SIG_ALRM 处理程序中调用 pthread_exit。结果 - 段错误。如果你在发送信号之前 sleep - 好的。

看起来在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;
}

输出:

main: 140130531731232
alrm_handler: 140130504095488
Segmentation fault

最佳答案

pthread_exit 不是异步信号安全的。您不能从信号处理程序调用它,除非您可以确定信号处理程序不会中断异步信号不安全的函数。特别是,调用 pthread_create 和进入新线程的启动函数之间的时间必须被视为异步信号不安全——标准中从未明确说明这一点,但您可以想到新的如果您愿意,线程仍处于“pthread_create”(这是异步信号不安全的)。

关于linux - 信号处理程序中的 pthread_exit 导致段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6370412/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com