我正在嘗試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的控制權,並重申程序在執行後停止。
我在執行線程時做了什麼錯誤?
如果你的程序依賴sched_yield,yield或pthread_yield工作,那麼它是絕望的,永遠不會工作。收益通話是一種優化工具,而這些都是。 –
請** **格式代碼正確,[如:根據張貼到堆棧溢出之前該指南(http://prohackr112.tk/guide/coding/proper-c-formatting)。 –
澄清以前的評論;在'SCHED_YIELD()'不給CPU的「下一個」線程;它會讓CPU返回調度程序來決定如何處理它。在各種情況下(在不同的操作系統)的調度可以決定給CPU回到那個剛剛產生(例如,也許是因爲調度知道線程的數據仍然在高速緩存中的「少緩存未命中」優化)的CPU,有效使'SCHED_YIELD()'什麼也不做(在某些情況下,即使有其他線程正在等待使用CPU)。 – Brendan