Когда нить попадает в состояние безнадежного сна - PullRequest
0 голосов
/ 27 мая 2019

У меня есть этот кусок кода, где он работает идеально в обычном случае.тем не менее, иногда поток попадает в состояние невозможного сна.

Это означает, что из состояния процесса я вижу, как этот поток попадает в https://code.woboq.org/userspace/glibc/sysdeps/unix/sysv/linux/nanosleep_nocancel.c.html#__nanosleep_nocancel

 struct timespec convertticktotimespec(unsigned long numticks)
{
   struct timespec tm;
  /* separate the integer and decimal portions */
   long nanoseconds =
    ((numticks / (float)sysconf(_SC_CLK_TCK)) - floor(numticks / (float)sysconf(_SC_CLK_TCK))) *
    NANOSEC_MULTIPLIER;
  tm.tv_sec  = numticks / sysconf(_SC_CLK_TCK);
  tm.tv_nsec = nanoseconds;

return tm;
}

void *thread(void *args)
{
  struct_S *s = (struct_S *)args;

  while(1)
  {
    s->var = 1;

   struct timespec tm = convertticktotimespec(sysClkRateGet() * 13);

    if ( 0 !=nanosleep(&tm, NULL) ) {
      perror(nanosleep);
    }

  }
}

трассировка стека выглядит следующим образом

Thread 19 (Thread 0x7f225a043700 (LWP 16023)):
#0 0x00007f225b8913ed in __accept_nocancel () at ../sysdeps/unix/syscall-  
 template.S:84
#1 0x0000000000000000 in ?? () 


Thread 18 (Thread 0x7f225a076700 (LWP 15952)):
#0 0x00007f225b89126d in __close_nocancel () at ../sysdeps/unix/syscall-template.S:84
#1 0x0000000000000000 in ?? () 

Thread 14 (Thread 0x7f225a021700 (LWP 16035)):
#0 0x00007f225b8917dd in __nanosleep_nocancel () at ../sysdeps/unix/syscall-template.S:84
#1 0x0000000000000000 in ?? ()

Thread 13 (Thread 0x7f225a032700 (LWP 16034)): 
#0 0x00007f225b8917dd in __nanosleep_nocancel () at ../sysdeps/unix/syscall-template.S:84
 #1 0x0000000000000000 in ?? () 

 Thread 3 (Thread 0x7f225bbb3700 (LWP 15950)):
 #0 0x00007f225ab1e3f3 in ?? () from /lib/x86_64-linux-gnu/libc.so.6
 #1 0x0000000000000000 in ?? ()

 Thread 2 (Thread 0x7f225a010700 (LWP 16036)):
 #0 0x00007f225b8911ad in __write_nocancel () at ../sysdeps/unix/syscall-template.S:84
 #1 0x0000000000000000 in ?? () 

каким-то образомэтот поток случайно попадает в не подлежащий отмене состояние сна, хотя я нигде не нахожу четкого определения этого в Интернете, поэтому я предполагаю, что поток навсегда получает состояние сна, которое не может быть прервано. поэтому этот поток навсегда переходит в неактивное состояние.

Понятия не имею, почему это происходит, когда выполняется или отвечает за меньшее количество строк кода или инструкций.

fromcode.woboq, я обнаружил, что это вызывается из блокировки мьютекса.https://code.woboq.org/userspace/glibc nptl / pthread_mutex_timedlock.c.html # 416, но поток не использует мьютекс.

Единственное, что я подозреваю, это то, что структура struct_s размещена в общей памяти.эта переменная также доступна и назначается другим потоком из другого процесса.попадает ли поток в это состояние, внутренне в зависимости от приоритета потоков?

...