У меня есть этот кусок кода, где он работает идеально в обычном случае.тем не менее, иногда поток попадает в состояние невозможного сна.
Это означает, что из состояния процесса я вижу, как этот поток попадает в 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 размещена в общей памяти.эта переменная также доступна и назначается другим потоком из другого процесса.попадает ли поток в это состояние, внутренне в зависимости от приоритета потоков?