Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: cleanup

Do not send an uncaught signal to a thread to terminatekill it, because it the signal kills the entire process as opposed to rather than killing just the individual thread. This rule is a specific instance of SIG02-C. Avoid using signals to implement normal functionality.

Noncompliant Code Example

This code uses the pthread_kill() function to send a SIGKILL signal to the created thread. The thread receives the signal and the entire process is terminated.

Code Block
bgColor#ffcccc
void func(void *foo){
  /* Execution of thread */
}

int main(void) {
  int result;
  pthread_t thread;

  if ((result = pthread_create(&thread, NULL, func, 0)) != 0);
   {
    /* Handle Error */
  }
  if ((result = pthread_kill(thread, SIGKILL);) != 0) {
    /* Handle Error */
  }

  /* MayContinue continue executing briefly until the signal kills the process */

  return 0;
}

void func(void *foo){
  /* Execution of thread */
}

Compliant Solution

This code instead uses the pthread_cancel() function to terminate the thread. The thread continues to run until it reaches a cancellation point.  See See [Open Group 04] for lists of functions that are required to be, and allowed to be, cancellation points.  If If the cancellation type is set to asynchronous, the thread is terminated immediately. However,  POSIX POSIX only requires the pthread_cancel(), pthread_setcancelstate(), and pthread_setcanceltype() functions to be async-cancel safe. An application that calls other POSIX functions with asynchronous cancellation enabled is non-conforming. Consequently, we recommend disallowing asynchronous cancellation, as expalined by POS47-C. Avoid using threads that can be cancelled asynchronously.

Code Block
bgColor#ccccff

void func(void *foo) {
  /* Execution of thread */
}

int main(void) {
  int result;
  pthread_t thread;

  if ((result = pthread_create(&thread, NULL, func, (void*)0);
 0)) != 0) {
    /* Handle Error */
  }
  if ((result = pthread_cancel(thread);

)) != 0) {
    /* ContinuesHandle Error */

  return 0;
}

void func(void *foo){
  /* Execution of thread *//* Continue executing until the signal kills the process */

  return 0;
}

Risk Assessment

Sending the signal to a process causes it to be abnormally terminated.

...