我经常在线程开始后看到Sleep(N),有时我看到Thread :: Sleep(N);其中N以毫秒为单位。它是否意味着将当前线程置于休眠状态以便另一个线程可以启动?
我感谢任何回复
答案 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将无条件地放弃当前时间片到另一个进程。
答案 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秒内填满缓存。否则,睡得更短或更快地处理消息。