天天看點

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秒的時間内,自身不需要排程(直接睡覺了),不要給自身配置設定時間片了。

使cpu更容易易主(因為放棄時間片了,是以就易主了)

 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會立刻轉向排程别的線程了。

繼續閱讀