2016-01-22 105 views
1

當所有四個線程都在等待時,我有四個線程正在等待條件變量和第五個線程帖子條件變量。當我將線程優先級設置爲最大值99時,線程切換需要很多時間,這遠遠不能接受。任何人都可以看看並告訴發生了什麼?Pthread調度策略和優先級

#define N_WORK_THREADS  4 
pthread_mutex_t count_mutex  = PTHREAD_MUTEX_INITIALIZER; 
pthread_cond_t condition_var = PTHREAD_COND_INITIALIZER; 

void *functionCount1(void * arg); 
void *functionCount2(void * arg); 

int count = 0; 
int valid = 0; 
int thread_personal[N_WORK_THREADS]; 

static int display_thread_sched_attr(int id) 
{ 
    int policy, s; 
    struct sched_param param; 

    s = pthread_getschedparam(pthread_self(), &policy, &param); 
    if (s != 0) { printf("pthread_getschedparam"); return 1; } 

    printf("Thread Id=%d policy=%s, priority=%d\n",id, 
      (policy == SCHED_FIFO) ? "SCHED_FIFO" : (policy == SCHED_RR) ? "SCHED_RR" : (policy == SCHED_OTHER) ? "SCHED_OTHER" : "???", 
      param.sched_priority); 

    return 0; 
} 


int main(void) 
{ 
    pthread_t  thread_work[N_WORK_THREADS]; 
    pthread_t  thread; 
    int    i,s; 
    pthread_attr_t attr; 
    struct   sched_param param; 

    s = pthread_attr_init(&attr); 
    if (s != 0) { printf("pthread_attr_init"); return 1; } 

    s = pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED); 
    if (s != 0) { printf("pthread_attr_setinheritsched"); return 1; } 

    s = pthread_attr_setschedpolicy(&attr, SCHED_RR); 
    if (s != 0) { printf("pthread_attr_setschedpolicy"); return 1; } 

    param.sched_priority = 99; 
    s = pthread_attr_setschedparam(&attr, &param); 
    if (s != 0) { printf("pthread_attr_setschedparam"); return 1; } 

    for (i=0; i<N_WORK_THREADS; i++) { thread_personal[i] = 0; } 

    for (i=0; i<N_WORK_THREADS; i++) { pthread_create(&thread_work[i], &attr, &functionCount1, (void *)i); } 

    param.sched_priority = 99; 
    s = pthread_attr_setschedparam(&attr, &param); 
    if (s != 0) { printf("pthread_attr_setschedparam"); return 1; } 
    pthread_create(&thread, &attr, &functionCount2, (void *)N_WORK_THREADS); 

    for (i=0; i<N_WORK_THREADS; i++) { pthread_join(thread_work[i], NULL); } 
    pthread_join(thread, NULL); 

    for (i=0; i<N_WORK_THREADS; i++) { printf("Thread Id=%d Mutex USed=%d\n",i,thread_personal[i]); } 

    exit(EXIT_SUCCESS); 
} 

void *functionCount1(void * arg) 
{ 
    int i; 
    int id = (int) arg; 

    display_thread_sched_attr(id); 

    for(i=0; i<10; i++) 
    { 
    pthread_mutex_lock(&count_mutex); 

    thread_personal[id] += 1; 

    while (((count>>id) & 0x1) == 0) 
    { 
     pthread_cond_wait(&condition_var, &count_mutex); 
    } 
    count = count^ (1<<id); 

    printf("Thread Id %d: Valid = %d\n",id,valid); 

    pthread_mutex_unlock(&count_mutex); 
    } 

    return NULL; 
} 

void *functionCount2(void * arg) 
{ 
    int check; 
    int id = (int) arg; 

    display_thread_sched_attr(id); 

    check =0; 
    while (check < 10) 
    {  
    pthread_mutex_lock(&count_mutex); 

    if (count == 0) 
    { 
     pthread_cond_broadcast (&condition_var); 
     count =0xF; 
     printf("Thread Id %d: Counter = %d\n",id,check); 
     valid = check++; 
    } 

    pthread_mutex_unlock(&count_mutex); 
    } 
    return NULL; 
} 
+0

您使用的平臺和工具是什麼?除非我將所有調度策略配置代碼註釋掉,否則該程序根本不適用於我(線程不打印輸出)。我正在使用gcc版本4.8.4在Linux 3.16.0 x86_64上進行測試。 –

+0

Linux 3.14,armv7平臺上的gcc 4.8.3。 – user3257306

回答

1

我無法啓用,因爲程序根本就不時在那裏(我在評論提到工作的調度策略代碼來測試你的程序:用gcc 4.8的Linux 3.16.0 x86_64的。 4)。

,但我想,你的問題可能是由於在functionCount2()循環:

while (check < 10) 
{  
    pthread_mutex_lock(&count_mutex); 

    if (count == 0) 
    { 
     pthread_cond_broadcast (&condition_var); 
     count =0xF; 
     printf("Thread Id %d: Counter = %d\n",id,check); 
     valid = check++; 
    } 

    pthread_mutex_unlock(&count_mutex); 
} 

一般來說,互斥對象的並行線程收購不能保證公平或FIFO(不過說實話,我不確定線程​​調度策略如何影響它)。我相信發生的事情是這個循環釋放count_mutex然後立即重新獲得它,即使其他線程被阻塞等待聲明互斥體。隨着調度策略的實施,這可能會發生,直到線程使用其量子。

+0

我懷疑任何線程正在使用它的量子,但你指向functionCount2()?爲什麼它不能在functionCount1()中發生? 而你的觀點是正確的,因爲我統計出functionCount2收購互斥()和計數進來數千.... – user3257306

+0

我收到了你品脫現在你是絕對正確的。 functionCount2()一次又一次地獲取互斥量,這是造成問題的原因。在互斥鎖請求之前我添加了一點睡眠並且問題消失。謝謝你。 你能提出一個建議,對這個問題調度策略和優先級有什麼影響?當我改變使用functionCount2()的線程的優先級時,我注意到了不同的行爲。 – user3257306

+0

對不起,我對調度策略說不出太多 - 我只是沒有機會使用它。我所知道的全部內容都是基於文檔內容的基礎。另外,正如我所指出的,當我嘗試從你的例子中使用它時,事情根本不起作用;我沒有機會做任何深入的調試。 –

相關問題