【发布时间】:2011-04-07 16:19:22
【问题描述】:
我正在使用 pthreads 创建一个具有多个线程的程序。
是sleep() 导致进程(所有线程)停止执行还是只是我正在调用sleep 的线程?
【问题讨论】:
标签: c++ multithreading pthreads
我正在使用 pthreads 创建一个具有多个线程的程序。
是sleep() 导致进程(所有线程)停止执行还是只是我正在调用sleep 的线程?
【问题讨论】:
标签: c++ multithreading pthreads
只是线程。 POSIX documentation for sleep() 说:
sleep()函数将导致调用线程暂停执行...
【讨论】:
sleep(3) 手册页就是这种情况。我建议向 Ubuntu 提交有关文档的错误。
试试这个,
#include <unistd.h>
usleep(microseconds);
【讨论】:
nanosleep 更容易使用。
我通常使用nanosleep,它工作正常。 Nanosleep 暂停调用线程的执行。我也有同样的疑问,因为在某些手册页中 sleep 指的是整个过程。
【讨论】:
实际上,在少数情况下您只想睡一小段时间(毫秒)。对于 Linux,请阅读 time(7),另请参阅 this answer。对于超过一秒的延迟,请参阅sleep(3),对于较小的延迟,请参阅nanosleep(2)。 (一个反例可能是 RasPerryPi 运行一些嵌入式 Linux 并驱动机器人;在这种情况下,您可能确实每十分之一秒从某个硬件设备读取)。当然,休眠只是一个内核调度的任务(即一个进程或线程)。
您可能想要编写一些event loop 的代码。在这种情况下,您可能需要poll(2) 或select(2) 之类的东西,或者您想使用与互斥锁关联的条件变量(阅读Pthread tutorial 关于pthread_cond_init 等...)。
线程是昂贵的资源(因为每个线程都需要一个call stack,通常至少需要一兆字节)。您应该更喜欢拥有一个或几个事件循环,而不是拥有数千个线程。
如果您正在为 Linux 编写代码,请参阅 Advanced Linux Programming 和 syscalls(2) 和 pthreads(7)。
【讨论】:
sleep() 函数不会停止特定线程,但会在指定的时间内停止整个进程。为了停止特定线程的执行,我们可以使用一个 pthread 条件对象并使用pthread_cond_timedwait() 函数使线程等待特定的时间。每个线程都有自己的条件对象,它永远不会收到来自任何其他线程的信号。
【讨论】:
sleep() 将导致当前线程休眠。见sleep(3)。许多较旧的手册页仍然使用“进程”一词,但实际上线程就是进程。