2017-02-27 73 views
-1

我正在嘗試3個線程打印以字母,擴展和其他開頭的單詞。下面是我的程序:sched_yield用於C語言中的線程程序

int main(int argc, char** argv) 
{ 
int i,j,n_thread; 

pthread_t threads[3]; 

digit=0;vowels=0;consonants=0,pos=1; 


pthread_create(&threads[0],NULL,check_Vower(argc,argv),NULL); 
pthread_create(&threads[1],NULL,check_Consonant(argc, argv),NULL); 
pthread_create(&threads[2],NULL,check_Other(argc, argv),NULL); 


pthread_join(threads[0],NULL); 
pthread_join(threads[1],NULL); 
pthread_join(threads[2],NULL); 

printf("\nVowels = %d",vowels); 
printf("\nConsonants = %d",consonants); 
printf("\nDigits = %d",digit); 
return 0;  
} 

void *check_Vower(int argc, char** argv) 
{ 

char first; 
printf("Thread Vower\n"); 
int i; 

//while(argv[pos] != NULL) 
for(i = 1; i < argc; i++) 
{ 
    printf("arg pos %s\n", argv[pos]); 
    first = argv[pos][0]; 
    //if(isalpha(first)){ 
     if((toupper(first)=='A') || (toupper(first)=='E') ||  (toupper(first)=='I') || (toupper(first)=='O') || (toupper(first)=='U')) 
     { 
      //pthread_mutex_lock(&lock1); 
      printf("VOWEL: %s\n", argv[pos]); 
      vowels++; 
      pos++; 
      // sched_yield(); 
      //pthread_mutex_unlock(&lock1); 
     } 
    //} 

    sched_yield(); 
    printf("dkm\n"); 
} 

pthread_exit(NULL); 
} 

void *check_Consonant(int argc, char** argv) 
{ 
printf("Thread consonants\n"); 
char first; 
int i; 

//while(argv[pos] != NULL) 
for(i = 1; i < argc; i++) 
{ 
    first = argv[pos][0]; 

    //if(isalpha(first)){ 
     if((toupper(first) !='A') && (toupper(first)!='E') && (toupper(first)!='I') && (toupper(first)=='O') && (toupper(first)!='U')) 
     { 
      //pthread_mutex_lock(&lock1); 
      printf("VOWEL: %s\n", argv[pos]); 
      vowels++; 
      pos++; 
      //sched_yield(); 
      //pthread_mutex_unlock(&lock1); 
     } 
    //} 

    else 
     sched_yield(); 
    printf("sche_yield fails \n"); 
} 

pthread_exit(NULL); 
} 

void *check_Other(int argc, char** argv) 
{ 
printf("Thread Other\n"); 
int temp; 
char first; 
temp=toupper(first)-65; 

int i; 

//while(argv[pos] != NULL) 
for(i = 1; i < argc; i++) 
{ 
    first = argv[pos][0]; 

    if(!isalpha(first)) 
    { 
     if(temp>-17 && temp<-7) 
     { 
      //pthread_mutex_lock(&lock1); 
      printf("OTHER: %s\n", argv[pos]); 
      digit++; 
      pos++; 
      //sched_yield(); 
      //pthread_mutex_unlock(&lock1); 
     } 
    }else 
     sched_yield(); 
} 

pthread_exit(NULL); 
} 

的SCHED_YIELD應該控制讓給下一個線程,一旦它無法檢測到該線程一個字,但它只是不斷通過for循環,並沒有放棄CPU的控制權,並重申程序在執行後停止。

我在執行線程時做了什麼錯誤?

+0

如果你的程序依賴sched_yield,yield或pthread_yield工作,那麼它是絕望的,永遠不會工作。收益通話是一種優化工具,而這些都是。 –

+0

請** **格式代碼正確,[如:根據張貼到堆棧溢出之前該指南(http://prohackr112.tk/guide/coding/proper-c-formatting)。 –

+0

澄清以前的評論;在'SCHED_YIELD()'不給CPU的「下一個」線程;它會讓CPU返回調度程序來決定如何處理它。在各種情況下(在不同的操作系統)的調度可以決定給CPU回到那個剛剛產生(例如,也許是因爲調度知道線程的數據仍然在高速緩存中的「少緩存未命中」優化)的CPU,有效使'SCHED_YIELD()'什麼也不做(在某些情況下,即使有其他線程正在等待使用CPU)。 – Brendan

回答

1

這與yield和與調用帶有錯誤參數的pthread_create有關的一切無關。

你完全忽略了關於指針類型的所有編譯器警告嗎?

你是在pthread_create期間調用你的線程函數。然後該線程試圖執行返回值作爲線程函數。

+0

我得到零編譯錯誤與在pthread_create()函數 –

+0

@InnoveerHipstirt有關:是的,我看到過了。我太習慣於默認設置,包括「-Wall -W -pedantic」如果你使用GCC,添加這些內容 –

+0

Anw,你是否仍然認爲這是因爲pthread_create()方法導致prog不能正常工作? –