2013-03-20 70 views
0

我正在为我的套接字服务器应用程序使用boost asio。每个连接都由一个升压线程处理。我使用每个核心的io_service,每个io_service在一个工作线程中运行。mysql SIGSEGV多线程提升

在我的连接我使用MySQL C API来查询数据库。 当流量很高时,有时候mysql_query/close api会做一个SIGSEGV。

是否有办法处理每个线程的SIGSEGV,以便我的线程调用执行SIGSEGV的mysql api,只处理其他线程不受影响的异常。

这是我收到错误 线程[17] 2844 [芯:0](暂停:信号:SIGSEGV:分段故障)在0x7ffff78d1ae5 net_flush() 为0x0 net_real_write()在0x7ffff78d201b net_write_command()在处0x7ffff78cd58d mysql_real_query()0x7ffff78cf1ca mysql_send_query()0x7ffff78d21d0 cli_advanced_command()在0x7ffff78cd5a9

回答

0

SIGSEGV是同步信号。因此,SIGSEGV产生的线程是将在其信号处理程序中处理SIGSEGV的线程。此行为是记录here

某些信号,如SIGSEGVSIGFPE,作为执行特定机器语言指令的结果产生的是螺纹定向,因为是使用pthread_kill

针对一个特定的线程的信号

据我所知,没有办法退出信号处理程序中的特定线程,同时保持定义的行为。为了保持定义的行为,只有以下调用可以从信号处理程序中进行:

abort()   accept()  access()  aio_error()  aio_return() 
aio_suspend() alarm()   bind()  cfgetispeed() cfgetospeed() 
cfsetispeed() cfsetospeed() chdir()  chmod()   chown() 
clock_gettime() close()   connect()  creat()   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()  open()  openat()  pause() 
pipe()   poll()   posix_trace_event()   pselect() 
raise()   read()   readlink() readlinkat() recv() 
recvfrom()  recvmsg()  rename()  renameat()  rmdir() 
select()  sem_post()  send()  sendmsg()  sendto() 
setgid()  setpgid()  setsid()  setsockopt() setuid() 
shutdown()  sigaction()  sigaddset() sigdelset()  sigemptyset() 
sigfillset() sigismember() signal()  sigpause()  sigpending() 
sigprocmask() sigqueue()  sigset()  sigsuspend() sleep() 
sockatmark() socket()  socketpair() stat()   symlink() 
symlinkat()  tcdrain()  tcflow()  tcflush()  tcgetattr() 
tcgetpgrp()  tcsendbreak() tcsetattr() tcsetpgrp()  time() 
timer_getoverrun()    timer_gettime()    timer_settime() 
times()   umask()   uname()  unlink()  unlinkat() 
utime()   utimensat()  utimes()  wait()   waitpid() 
write()   _exit()   _Exit() 

若要定义的行为,考虑隔离是造成SEGSEGV到其自己的进程的代码。例如,分支和使用每个连接的进程将允许SIGSEGV仅杀死错误发起的进程,而不影响其他连接或引入未定义的行为。