从 pthread 调用 sleep() 是不是会使线程进入睡眠状态或进程?

Posted

技术标签:

【中文标题】从 pthread 调用 sleep() 是不是会使线程进入睡眠状态或进程?【英文标题】:Does calling sleep() from pthread put thread to sleep or process?从 pthread 调用 sleep() 是否会使线程进入睡眠状态或进程? 【发布时间】:2011-09-05 18:21:37 【问题描述】:

看到有一个关于pthread sleep linux的问题

但是,当我在我的 Linux 机器上查找手册页时,我看到以下内容:

概要 #include

   unsigned int sleep(unsigned int seconds);

描述 sleep() 使当前进程休眠到 seconds 秒 已经过去或 没有被忽略的信号到达。

所以我的问题是我想知道我应该遵循哪个手册页来让线程休眠?另外,如果两者都为真,我该如何控制呢?

我可能可以编写一些代码来测试它,但我也想确保听到其他人的一些反馈。

【问题讨论】:

【参考方案1】:

您手册页中的措辞可能有误。信任标准并信任 the man page on kernel.org。写信给您的发行版文档的维护者,告诉他们更新手册页。

【讨论】:

+1 用于更新您的答案以指向 kernel.org。收回我的答案,它做了同样的事情。但是,至于“信任标准”:只有在阅读 Linux 文档后才这样做,因为 Linux 有时会故意偏离 POSIX 行为。 感谢您的意见。我会按照你的建议去做。 更好 - 写信给上述代码的维护者并要求他们修复错误并符合 POSIX【参考方案2】:

在我的 Linux 机器上有两个关于睡眠功能的手册页:

$ man -k sleep
sleep (3)   - Sleep for the specified number of seconds
sleep (3p)  - suspend execution for an interval of time

第一个和你的一样说“当前流程”。 第二个说“调用线程”,但它的序言指出:

本手册页是 POSIX 程序员手册的一部分。该接口的 Linux 实现可能会有所不同(请参阅相应的 Linux 手册页 Linux 行为的详细信息),或者该接口可能无法在 Linux 上实现。

所以我得出结论,sleep(3) 描述了实际行为,sleep(3p) 仅供参考。

【讨论】:

【参考方案3】:

@cnicutar 引用的手册页说sleep 不是线程安全的(也许这是自 2011 年以来的新内容?)。有趣的是,Dave Butenhof 1997 年的书(“使用 Posix 线程编程”)确实包含一个使用 sleep 休眠线程的示例(第 18 页)。 This 是 comp.programming.threads 上的一个旧线程(另一种),Butenhof 和其他人在其中讨论了 pthreads 上下文中的nanosleep

简而言之,nanosleep 是,我认为,好的,但 sleep 不是。 kernel.org 上的 nanosleep 手册页没有说明 nanosleep 是否是线程安全的,但 gcc sleeping docs 说它是。

【讨论】:

以上是关于从 pthread 调用 sleep() 是不是会使线程进入睡眠状态或进程?的主要内容,如果未能解决你的问题,请参考以下文章

sleep() 会影响 pthread 执行吗?

如果 pthread_cond_signal 是线程中的最后一次调用,是不是存在数据竞争?

从睡眠中唤醒主线程

互斥锁线程是不是使用 CPU 时间?

从 Swift 5.3 版调用 C 函数:使用 pthreads

Linux多线程编程 - sleep 和 pthread_cond_timedwait