Thread中sleep()函数的用途是什么?

时间:2016-06-24 17:09:48

标签: c++ multithreading

我经常在线程开始后看到Sleep(N),有时我看到Thread :: Sleep(N);其中N以毫秒为单位。它是否意味着将当前线程置于休眠状态以便另一个线程可以启动?

我感谢任何回复

6 个答案:

答案 0 :(得分:6)

使用sleep()函数(及其朋友)通常表示设计缺陷。极少数例外是调试中使用的睡眠。

sleep的常见错误用法包括尝试将事件计时到一定时间(不好,因为没有人保证睡眠会占用非RT系统规定的那么多单位),试图等待对于某些事件(糟糕,因为等待事件你应该使用线程库可用的特定等待函数)或尝试产生资源 - 不好,因为如果你无事可做,只需退出线程。

答案 1 :(得分:1)

Sleep将线程置于非可运行状态达指定的时间或者直到信号唤醒进程。

当线程处于非可运行状态时,OS调度程序不会将线程调度到运行队列中,并且OS强制执行线程/上下文切换,以便另一个可运行的任务(线程/进程)可以运行代替。

答案 2 :(得分:0)

线程休眠函数通常意味着在至少提供的时间内阻止特定线程的执行,通常是为了让其他线程在没有任何干扰的情况下运行。从中。由于调度或资源争用延迟,它可能会阻塞超过提供的时间。但它不会使睡眠线程释放其锁定(如果有的话)!它们经常用于调试目的。

答案 3 :(得分:0)

执行Thread::Sleep(N);只会延迟程序的执行,通常会等待外部资源在那里......这是像Asm这样的低级/旧语言中非常常见的方式,没有OOP是能够和顺序运行的程序。现在是接口,回调,多线程,通知。使用这些技术只是一个坏习惯...

答案 4 :(得分:0)

如果有一个具有更高优先级的进程已准备好进行调度,

Sleep(0)将放弃当前时间片到另一个进程。如果没有进程安排,当前进程将立即返回 Sleep(n)其中n> 0将无条件地放弃当前时间片到另一个进程。

reference

答案 5 :(得分:0)

据我所知,我们对以下情况使用sleep()

1)模拟。当您需要模拟某些情况来测试代码时,您可以使用sleep() 例如,您正在设计一个模块,该模块将成为服务器。现在,您需要在客户端发送大量请求5秒的情况下测试您的服务器。要做这个测试,你不需要真正的客户。您只需要使用sleep(5000)模拟客户。

2)如你所述,给其他线程执行的机会。但请注意:sleep()将保留锁定。

3)节省CPU资源 例如,在非阻塞套接字的模式下,您可以这样编码:

while(true)
{
    sleep(200);
    res = accept(mysocket, NONBLOCKING);
    if (getMsg(res))
    {
        // do something
    }
    else
    {
        // do something
    }
}

这是非阻塞模式,当它执行accept时,它会立即检查是否有某些消息。如果没有消息,则继续。
在这种情况下,如果我们不像上面那样添加sleep(),那么这段代码将消耗大量的CPU资源(只是一个无限循环)。所以我们添加一个sleep(),以便其他线程或其他进程可以使用CPU。换句话说,现在CPU的使用效率更高 顺便说一句,网卡有自己的缓存,所以如果客户端向上面的代码同时发送一条消息,代码就会开始休眠1秒钟,这不会成为一个问题,因为1第二,消息仍然存在(在缓存中),因此代码可以获得它。但是,如果在这1秒内,有很多客户端发送消息,代码可能会错过消息,因为1秒太长而无法快速处理消息。总之,您必须确保收到的消息不能在1秒内填满缓存。否则,睡得更短或更快地处理消息。