簡體   English   中英

sched_setscheduler是針對所有線程還是主線程?

[英]sched_setscheduler is for all threads or main thread?

我有以下來源喜歡SCHED_RR優先級90:

int main(int argc, char** argv)
{
    const char *sched_policy[] = {
    "SCHED_OTHER",
    "SCHED_FIFO",
    "SCHED_RR",
    "SCHED_BATCH"
    };
    struct sched_param sp = {
        .sched_priority = 90
    };
    pid_t pid = getpid();
    printf("pid=(%d)\n",pid);
    sched_setscheduler(pid, SCHED_RR, &sp);
    printf("Scheduler Policy is %s.\n", sched_policy[sched_getscheduler(pid)]);

    pthread_t tid ;
    pthread_create(&tid , NULL, Thread1 , (void*)(long)3);
    pthread_create(&tid , NULL, Thread2 , (void*)(long)3);
    pthread_create(&tid , NULL, Thread3 , (void*)(long)3);
    while(1)
        sleep(100);
}

雖然shell“top”,我可以看到進程有-91的PR,看起來很有效,據我所知,在Linux中,thread1和thread2以及thread3是來自主線程的不同任務,它們只是共享相同的虛擬內存,我想知道在這個測試中,我是否需要添加

pthread_setschedparam(pthread_self(), SCHED_RR, &sp);

對於所有thread1,thread2和thread3,以便所有這3個可以使用SCHED_RR進行調度? 或者我不需要這樣做?! 如何觀察thread1,thread2和thread3線程是SCHED_RR還是SCHED_OTHER?

編輯:

sudo chrt -v -r 90 ./xxx.exe 

等着瞧 :

pid 7187's new scheduling policy: SCHED_RR
pid 7187's new scheduling priority: 90

我怎么能確定這只是主線程? 或pid 7187中的所有線程都是SCHED_RR策略?! 再次,如何觀察它?!

在創建任何新線程之前,您應檢查(並設置,如果需要)調度程序繼承屬性。

int pthread_attr_getinheritsched(const pthread_attr_t *attr, int *inheritsched);

int pthread_attr_setinheritsched(pthread_attr_t *attr, int inheritsched);

pthread_attr_getinheritsched()將存儲在inheritsched指向的變量中,其中包含兩個可能的值之一:

  • PTHREAD_INHERIT_SCHED - 使用attr創建的線程
    從創建線程繼承調度屬性; attr中的調度屬性被忽略。

  • PTHREAD_EXPLICIT_SCHED - 使用attr創建的線程從屬性對象指定的值中獲取其調度屬性。

如果您希望每個新創建的線程都繼承調用任務的調度程序屬性,則應設置PTHREAD_INHERIT_SCHED(如果尚未設置)。

另請注意:

新初始化的線程屬性對象中的inherit-scheduler屬性的默認設置是PTHREAD_INHERIT_SCHED

參考

$ man pthread_setschedparam
$ man pthread_attr_setinheritsched
  • (Blockquoted材料是從Linux man-pages項目的3.74版本的部分復制而來的。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM