sleep 函数 linux 线程吗,sleep函数在多线程中的作用

1、前言

多线程中经常会使用sleep()函数,我们知道cpu对于多线程的操作是采用时间片轮询的方式,即,时间片1操作线程A,时间片1结束后,时间片2操作线程B,时间片2结束后,时间片3操作线程A,依次交替执行。

2、linux系统中sleep函数原型

#include

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

#include

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

#include

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会立刻转向调度别的线程了。

标签:include,函数,int,主线,线程,时间,多线程,sleep

来源: https://blog.csdn.net/modi000/article/details/104669668

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值