2013-03-20 101 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僅殺死錯誤發起的進程,而不影響其他連接或引入未定義的行爲。