title: PTHREAD_CANCEL_ASYNCHRONOUS Cancels the whole process
body: <p>In a C program, I am using <code>PTHREAD_CANCEL_ASYNCHRONOUS</code> to cancel the thread immediately, as soon as the pthread_cancel is fired from the parent thread. But it is causing the whole process to get crash with <strong>Segmentation Fault</strong>. The job of child thread is to get some data from a database server. And my logic is that if it doesnt get data within 10 seconds, the thread should get killed from the parent thread.</p>
  
  <p>I want only to kill the child thread, not the whole process.</p>
  
  <pre><code>struct str_thrd_data
  {
          SQLHANDLE hstmt;
          int rc;
          bool thrd_completed_flag;
  };
  
  
  void * str_in_thread_call(void *in_str_arg)
  {
          int thrd_rc;
          struct str_thrd_data *str_arg;
          str_arg = in_str_arg;
  
          thrd_rc = pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL);
          if (thrd_rc != 0)
                 handle_error_en(thrd_rc, "pthread_setcancelstate");
  
          thrd_rc = pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
          if (thrd_rc != 0)
                 handle_error_en(thrd_rc, "pthread_setcancelstate");
  
          thrd_rc = pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
          if (thrd_rc != 0)
                 handle_error_en(thrd_rc, "pthread_setcanceltype");
          // Code to call SQL Dynamic Query from a Database Server. This takes time more than 10 seconds.
        thrd_rc = SQLExecute(hstmt);
          printf("\n*********************Normal Thread termination withing timelimit %d\n",str_arg-&gt;rc);
          str_arg-&gt;thrd_completed_flag = true;
  
  }
  
  int main()
  {
          printf("\nPJH: New THread created.\n");
          pthread_attr_t tattr;
          pthread_t th;
          size_t mysize = 1;
  
          struct str_thrd_data atd;
  
          atd.hstmt = hstmt;
          atd.rc= rc;
          atd.thrd_completed_flag = false;
  
          thrd_rc = pthread_attr_init(&amp;tattr);
          thrd_rc = pthread_attr_setstacksize(&amp;tattr, mysize);
          thrd_rc = pthread_create(&amp;th, &amp;tattr, &amp;str_in_thread_call, &amp;atd);
          if (thrd_rc != 0)
                 handle_error_en(thrd_rc, "pthread_create");
  
          // While Loop tp count till 10 seconds.
          while(timeout !=0)
          {
                  printf("%d Value of rc=%d\n",timeout, atd.rc);
                  if(atd.rc != 999) break;
                  timeout--;
                  usleep(10000);
          }
          rc = atd.rc;
          //Condition to check if thread is completed or not yet.
            if(atd.thrd_completed_flag == false)
          {
                  //Thread not comepleted within time, so Kill it now.
                  printf("PJH ------- 10 Seconds Over\n");
                  thrd_rc = pthread_cancel(th);
                  printf("PJH ------- Thread Cancelled Immediately \n");    
                  if (thrd_rc != 0)
                  {
                         handle_error_en(thrd_rc, "pthread_cancel");
                  }
                  printf("\nPJH &amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp; Thread Cancelled Manually\n");
          }
          thrd_rc = pthread_join(th,NULL);
          // some other job .....
  }
  </code></pre>
  
  <p><code>gdb process_name corefile</code> shows the below backtrace:- Mostly all SQL Library functions.</p>
  
  <pre><code>#0  0xffffe410 in __kernel_vsyscall ()
  #1  0x0059fe30 in raise () from /lib/libc.so.6
  #2  0x005a1741 in abort () from /lib/libc.so.6
  #3  0xdef3f5d7 in ?? () from /usr/lib/libstdc++.so.5
  #4  0xdef3f624 in std::terminate() () from /usr/lib/libstdc++.so.5
  #5  0xdef3f44c in __gxx_personality_v0 () from /usr/lib/libstdc++.so.5
  #6  0x007e1917 in ?? () from /lib/libgcc_s.so.1
  #7  0x007e1c70 in _Unwind_ForcedUnwind () from /lib/libgcc_s.so.1
  #8  0x007cda46 in _Unwind_ForcedUnwind () from /lib/libpthread.so.0
  #9  0x007cb471 in __pthread_unwind () from /lib/libpthread.so.0
  #10 0x007c347a in sigcancel_handler () from /lib/libpthread.so.0
  #11 &lt;signal handler called&gt;
  #12 0xffffe410 in __kernel_vsyscall ()
  #13 0x0064decb in semop () from /lib/libc.so.6
  #14 0xe0245901 in sqloSSemP () from /opt/IBM/db2/V9.1/lib32/libdb2.so.1
  #15 0xe01e7f3c in sqlccipcrecv(sqlcc_comhandle*, sqlcc_cond*) () from /opt/IBM/db2/V9.1/lib32/libdb2.so.1
  #16 0xe03fe135 in sqlccrecv () from /opt/IBM/db2/V9.1/lib32/libdb2.so.1
  #17 0xe02a0307 in sqljcReceive(sqljCmnMgr*) () from /opt/IBM/db2/V9.1/lib32/libdb2.so.1
  #18 0xe02d0ba3 in sqljrReceive(sqljrDrdaArCb*, db2UCinterface*) () from /opt/IBM/db2/V9.1/lib32/libdb2.so.1
  #19 0xe02c510d in sqljrDrdaArExecute(db2UCinterface*, UCstpInfo*) () from /opt/IBM/db2/V9.1/lib32/libdb2.so.1
  #20 0xe01392bc in CLI_sqlCallProcedure(CLI_STATEMENTINFO*, CLI_ERRORHEADERINFO*) () from /opt/IBM/db2/V9.1/lib32/libdb2.so.1
  #21 0xe00589c7 in SQLExecute2(CLI_STATEMENTINFO*, CLI_ERRORHEADERINFO*) () from /opt/IBM/db2/V9.1/lib32/libdb2.so.1
  #22 0xe0050fc9 in SQLExecute () from /opt/IBM/db2/V9.1/lib32/libdb2.so.1
  #23 0x080a81f7 in apcd_in_thread_call (in_apcd_arg=0xbc8e8f34) at dcs_db2_execute.c:357
  #24 0x007c4912 in start_thread () from /lib/libpthread.so.0
  #25 0x0064c60e in clone () from /lib/libc.so.6
  </code></pre>