mysql-SIGSEGV多线程boost

mysql-SIGSEGV多线程boost,mysql,boost-asio,segmentation-fault,Mysql,Boost Asio,Segmentation Fault,我正在为我的socket服务器应用程序使用boost asio。每个连接都由一个boost线程处理。我对每个核心使用io_服务,每个io_服务在一个工作线程中运行 在我的连接中,我使用mysql C API查询数据库。 当流量较大时,有时mysql\u查询/关闭api会执行SIGSEGV 有没有一种方法可以处理每个线程的SIGSEGV,这样我调用mysql api的线程只处理其他线程不受影响的异常 这就是我得到的错误 线程[17]2844[核心:0](挂起:信号:SIGSEGV:分段错误) 0x

我正在为我的socket服务器应用程序使用boost asio。每个连接都由一个boost线程处理。我对每个核心使用io_服务,每个io_服务在一个工作线程中运行

在我的连接中,我使用mysql C API查询数据库。 当流量较大时,有时mysql\u查询/关闭api会执行SIGSEGV

有没有一种方法可以处理每个线程的SIGSEGV,这样我调用mysql api的线程只处理其他线程不受影响的异常

这就是我得到的错误 线程[17]2844[核心:0](挂起:信号:SIGSEGV:分段错误) 0x0 0x7ffff78d1ae5处的net_real_write() 0x7ffff78d201b处的净冲洗() net_write_命令()位于0x7ffff78d21d0 0x7ffff78cf1ca处的cli_高级_命令() 0x7ffff78cd58d处的mysql_send_query()
0x7ffff78cd5a9处的mysql_real_query()是一个同步信号。因此,
SIGSEGV
发起的线程是在其信号处理程序中处理
SIGSEGV
的目标线程。这种行为被记录在案:

由于执行特定机器语言指令而生成的某些信号,如
SIGSEGV
SIGFPE
,是线程定向的,使用
pthread\u kill

据我所知,在保持已定义的行为的同时,无法退出信号处理程序中的特定线程。要保持定义的行为,只能从信号处理程序中进行以下调用:

abort()accept()access()aio_error()aio_return()
aio_suspend()报警()绑定()cfgetispeed()cfgetospeed()函数
cfsetispeed()cfsetospeed()chdir()chmod()chown()
clock_gettime()close()connect()create()dup())
dup2()execl()execle()execv()execve()
faccessat()fchmod()fchmodat()fchown()fchownat()
fcntl()fdatasync()fexecve()fork()fstat()
fstatat()fsync()ftruncate()futimens()getegid()
geteuid()getgid()getgroups()getpeername()getpgrp()
getpid()getppid()getsockname()getsockopt()getuid()
kill()link()linkat()listen()lseek()
lstat()mkdir()mkdirat()mkfifo()mkfifoat())
mknod()mknodat()打开()打开()暂停()
管道()轮询()posix_跟踪_事件()pselect()
raise()read()readlink()readlinkat()recv()
recvfrom()recvmsg()重命名()重命名()rmdir()
选择()sem_post()发送()发送消息()发送到()
setgid()setpgid()setsid()setsockopt()setuid()
shutdown()sigaction()sigaddset()sigdelset()sigemptyset()
sigfillset()sigismember()signal()sigpause()sigpunding()
sigprocmask()sigqueue()sigset()SIGSSUSPEND()睡眠()
sockatmark()socket()socketpair()stat()symlink()
symlinkat()tcdrain()tcflow()tcflush()tcgetattr()
tcgetpgrp()tcsendbreak()tcsetattr()tcsetpgrp()时间()
计时器\u GetOverflow()计时器\u gettime()计时器\u settime()
times()umask()uname()unlink()unlink()unlinkat()
utime()utimensat()utimes()wait()waitpid()
写入()\u退出()\u退出()

为了获得定义的行为,考虑将导致<代码> SEGSEVV<代码>的代码隔离到自己的进程中。例如,为每个连接分叉和使用一个进程将允许

SIGSEGV
仅终止产生错误的进程,而不会影响其他连接或引入未定义的行为