pthread 睡眠 linux

pthread sleep linux

提问人:Steveng 提问时间:9/3/2010 最后编辑:lucian.pantelimonSteveng 更新时间:11/13/2022 访问量:101584

问:

我正在使用 pthreads 创建一个具有多个线程的程序。

是导致进程(所有线程)停止执行还是只是我调用的线程?sleep()sleep

C++ 多线程 pthreads

评论


答:

50赞 caf 9/3/2010 #1

只是线程。sleep() 的 POSIX 文档说:

该函数将导致调用线程暂停执行...sleep()

评论

6赞 user48956 5/15/2012
“man 3 sleep”是这样说的:“sleep()使调用进程进入睡眠状态,直到几秒钟过去......”(Ubuntu 10)。该函数位于 unistd.h 中。此文档是否错误,或者是否有第二个睡眠功能?
11赞 caf 5/15/2012
@user48956:由于历史原因,手册页经常使用“进程”,而行为现在适用于“线程”——您引用的手册页就是这种情况。我建议向 Ubuntu 提交有关文档的错误。sleep(3)
6赞 CMorgan 9/29/2011 #2

我通常使用nanosleep,它工作正常。 Nanosleep 会取代调用线程的执行。我也有同样的疑问,因为在某些手册页中,睡眠指的是整个过程。

11赞 Chand Priyankara 6/5/2015 #3

试试这个,

#include <unistd.h>

usleep(microseconds);

评论

0赞 Thomas Tempelmann 12/20/2016
是的,这比大多数情况下更容易使用。nanosleep
7赞 dpi 5/6/2018
请注意,usleep() 已过时,已从 POSIX.1-2008 中删除。如果需要更高的分辨率,则应使用 sleep() 或 nanosleep()。
-5赞 Ricky 10/30/2018 #4

sleep()函数不会停止特定线程,但它会在指定的时间内停止整个进程。为了停止特定线程的执行,我们可以使用一个 pthread 条件对象并使用函数使线程等待特定时间。每个线程都有自己的条件对象,它永远不会收到来自任何其他线程的信号。pthread_cond_timedwait()

评论

1赞 Will Eccles 6/8/2020
这是不准确的。将导致当前线程休眠。看。许多较旧的手册页仍然使用“进程”一词,但实际上线程就是一个进程。sleep()sleep(3)
0赞 Basile Starynkevitch 7/4/2020 #5

在实践中,很少有情况下您只想睡一小段延迟(毫秒)。对于 Linux,请阅读 time(7),并查看此答案。对于超过一秒的延迟,请参见 sleep(3),对于较小的延迟,请参见 nanosleep(2)。(一个反例可能是运行一些嵌入式Linux并驱动机器人的RasPerryPi;在这种情况下,你可能确实每十分之一秒从某个硬件设备读取一次)。当然,休眠只是一个内核调度的任务(所以是一个进程或线程)。

您可能希望编写一些事件循环代码。在这种情况下,您可能想要像 poll(2) 或 select(2) 这样的东西,或者您想要使用与互斥锁相关的条件变量(阅读 Pthread 教程等)。pthread_cond_init

线程是昂贵的资源(因为每个线程都需要一个调用堆栈,通常至少需要一兆字节)。您应该更喜欢有一个或几个事件循环,而不是有数千个线程。

如果您正在为 Linux 编写代码,请阅读 Advanced Linux Programming and syscalls(2)pthreads(7)。

0赞 rjhcnf 11/13/2022 #6

Posix 休眠函数不是线程安全的。https://clang.llvm.org/extra/clang-tidy/checks/concurrency/mt-unsafe.html