线程何时进入无法取消的睡眠状态

时间:2019-05-27 02:48:16

标签: linux multithreading thread-safety thread-sleep

我有这段代码在正常情况下可以正常工作。但是,有时线程会进入无法取消的睡眠状态。

这意味着从进程的状态来看,我看到此线程进入了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分配在共享内存中。该变量也可以由另一个进程中的其他线程访问和分配。线程是否在内部根据线程的优先级而进入这种状态?

0 个答案:

没有答案