C语言 为什么在winpthreads的' nanosleep '实现中多次调用' pthread_testcancel



winpthreads的nanosleep实现,它是POSIX线程到Windows的一个端口,在它的实现中多次调用pthread_testcancel

[nanosleep.c]中的nanosleep调用未导出的pthread_delay_np_ms并执行实际睡眠。这是[thread.c]中pthread_delay_np_ms的代码。

int
pthread_delay_np_ms (DWORD to)
{
struct _pthread_v *s = __pthread_self_lite ();
if (!to)
{
pthread_testcancel ();
Sleep (0);
pthread_testcancel ();
return 0;
}
pthread_testcancel ();
if (s->evStart)
WaitForSingleObject (s->evStart, to);
else
Sleep (to);
pthread_testcancel ();
return 0;
}

您可以看到pthread_testcancel由于某种原因被多次调用。

额外代码的原因是什么,而我认为这可能像下面一样简单?

int
pthread_delay_np_ms (DWORD to)
{
Sleep (to);
return 0;
}

pthread_testcancel实现了什么?此外,一个侧面的问题是,为什么WaitForSingleObject优先于Sleep时,一个虚拟事件句柄是可用的?

另一个线程可以调用pthread_cancel,在这种情况下,WaitForSingleObject将立即返回,线程将被杀死,而您的简单Sleep将在未知的时间内保持一个现在毫无意义的线程。

为什么他们在Sleep(0)if (s->evStart)之前调用pthread_testcancel,我不知道。也许你应该直接问作者,如果你这么关心它。我想他们的存在是有原因的……

最新更新