sleep函数在多线程中的作用
1、前言
多线程中经常会使用sleep()函数,我们知道cpu对于多线程的操作是采用时间片轮询的方式,即,时间片1操作线程A,时间片1结束后,时间片2操作线程B,时间片2结束后,时间片3操作线程A,依次交替执行。
2、linux系统中sleep函数原型
#include <unistd.h>
unsigned int sleep (unsigned int seconds);
参数:线程挂起秒数
返回值:进程/线程挂起到参数所指定的时间则返回0,若有信号中断则返回剩余秒数
3、函数作用
sleep函数的作用是:线程告诉操作系统,在second秒的时间内,自身不需要调度(直接睡觉了),不要给自身分配时间片了。
1)例如:单线程的例子
int main()
{
while(1)
{
//do sth.
sleep(1);
//do sth.
}
return 0;
}
while(1)死循环,一直在占用CPU,使其他进程得不到cpu资源,使用sleep,使该线程挂起,为其他进程让路。在程序没有时效性或者在程序运行时间允许的范围内添加合适秒数------sleep(seconds).
2)例如:主线程不加sleep,不加pthread_join的多线程
#include<unistd.h>
#include<pthread.h>
void *myFunc(void *p){
int i=0;
for(i;i<2;i++){
printf("myFunc i=%d\n",i);
}
printf("son thread...\n");
return NULL;
}
int main(){
pthread_t thread;
if(pthread_create(&thread,NULL,myFunc,NULL))
perror("pthread_create fail");
return -1;
}
printf("main thread...\n");
return 0;
}
主线程中,没有使用sleep()函数,则主线程直接输出main thread...便退出了,并没有时间去执行子线程(主线程的时间片内执行到return 0 了,已经进程直接结束,都没有来得及执行子线程的时间片(虽然子线程已经处于就绪态了))
这种情况下,程序一开始一直处于主线程的时间片内。
3)例如:主线程中加sleep
#include<unistd.h>
#include<pthread.h>
void *myFunc(void *p){
int i=0;
for(i;i<2;i++){
printf("myFunc i=%d\n",i);
}
printf("son thread...\n");
return NULL;
}
int main(){
pthread_t thread;
if(pthread_create(&thread,NULL,myFunc,NULL))
perror("pthread_create fail");
return -1;
}
sleep(1);//添加sleep//此处使用phread_join()函数也可以
printf("main thread...\n");
return 0;
}
如上所示,主线程中添加了sleep函数,
执行结果
myFunc i=0
myFunc i=1
son thread...
main thread...
sleep(1);主线程挂起了1s,放弃了时间片剩余部分,cpu便去执行子线程了,1s钟后主线程处于就绪态,在子线程时间片结束后,cpu开始继续执行主线程。
4、总结
个人理解:使用了sleep的同时,线程在second秒时间内处于挂起状态,同时也意味着,放弃了线程当前时间片中剩余的部分,也就是说程序执行到sleep语句后,cpu会立刻转向调度别的线程了。
上一篇: 解决Android中AsyncTask的多线程阻塞问题
下一篇: Re库——正则表达式的运用
推荐阅读
-
大数据在托管和SEO中的作用有哪些?
-
php中函数前加&符号的作用分解
-
在Word2010文档中创建包含函数的公式
-
在Python中使用itertools模块中的组合函数的教程
-
在PHP中实现Javascript的escape()函数代码
-
Shell中的函数、函数定义、作用域问题介绍
-
深入理解JavaScript 中的匿名函数((function() {})();)与变量的作用域
-
PHP字符串函数系列之nl2br(),在字符串中的每个新行 ( ) 之前插入 HTML 换行符br
-
在Oracle的函数中,返回表类型的语句
-
PHP字符串函数系列之nl2br(),在字符串中的每个新行 ( ) 之前插入 HTML 换行符br