【问题标题】:pthread sleep linuxpthread 睡眠 linux
【发布时间】:2011-04-07 16:19:22
【问题描述】:

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

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

【问题讨论】:

    标签: c++ multithreading pthreads


    【解决方案1】:

    只是线程。 POSIX documentation for sleep() 说:

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

    【讨论】:

    • 这是“man 3 sleep”所说的:“sleep() 使调用进程休眠,直到秒秒过去......”(Ubuntu 10)。该函数在 unistd.h 中。这个文档是错误的还是有第二个睡眠功能?
    • @user48956:由于历史原因,手册页经常使用“进程”,现在该行为适用于“线程” - 您所引用的 sleep(3) 手册页就是这种情况。我建议向 Ubuntu 提交有关文档的错误。
    【解决方案2】:

    试试这个,

    #include <unistd.h>
    
    usleep(microseconds);
    

    【讨论】:

    • 是的,在大多数情况下,这比nanosleep 更容易使用。
    • 请注意,usleep() 已过时,已从 POSIX.1-2008 中删除。如果需要更高的分辨率,您应该使用 sleep() 或 nanosleep()。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      实际上,在少数情况下您只想睡一小段时间(毫秒)。对于 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 Programmingsyscalls(2)pthreads(7)

      【讨论】:

        【解决方案5】:

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

        【讨论】:

        • 这是不准确的。 sleep() 将导致当前线程休眠。见sleep(3)。许多较旧的手册页仍然使用“进程”一词,但实际上线程就是进程。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-10-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-09
        • 2011-12-22
        • 1970-01-01
        相关资源
        最近更新 更多