2015-10-29 41 views
1

我想製作一個程序,用2個函數寫1到100之間的奇數和偶數,第一個函數打印前5個奇數,第二個函數打印前5個偶數,再次打印返回第一個函數打印第二個5個奇數,依此類推。 在這個程序中,我想僅在2線程之間交替,但我找不到解決方案。這裏是我的代碼,在這段代碼中,我創建了40個線程。有誰知道如何在2個線程之間交替並找到相同的輸出。2個線程之間的交替

#include<stdio.h> 
#include<pthread.h> 
pthread_t tid[40]; 
int pair=2; 
int impair=1 ; 
pthread_mutex_t lock; 

void* genpair(void *arg) 
{ 
    pthread_mutex_lock(&lock); 
    int i = 0; 
    for (i=0 ; i<5 ; i++,pair+=2) 
    { 
     printf("%d ",pair) ; 
    } 
printf(" ");  
pthread_mutex_unlock(&lock); 

    return NULL; 
} 
void* genimpair(void *arg) 
{ 
    pthread_mutex_lock(&lock); 
    int i = 0; 
    for (i=0 ; i<5 ; i++,impair+=2) 
    { 
     printf("%d ",impair) ; 
    } 
printf(" ");  
pthread_mutex_unlock(&lock); 

    return NULL; 
} 

int main(void) 
{ 
    int i = 0; 
    int j=0 ; 
    int err; 

    if (pthread_mutex_init(&lock, NULL) != 0) 
    { 
     printf("\n mutex init failed\n"); 
     return 1; 
    } 

    for(j=0 ; j<20 ; j+=2) 
    { 
     pthread_create(&(tid[j]), NULL, &genpair, NULL); 
     pthread_create(&(tid[j+1]), NULL, &genimpair, NULL); 
     pthread_join(tid[j], NULL); 
     pthread_join(tid[j+1], NULL);   
    } 

    pthread_mutex_destroy(&lock); 

    return 0; 
} 
+0

請描述你的程序的當前行爲。但對於初學者來說,在'pthread_mutex_unlock'之前放置一個'printf(「\ n」)'來刷新緩衝輸出,以便它出現在stdout上。 – kaylum

+0

使用線程完成任務毫無意義。 – nwp

+0

@nwp如果這是一個學習練習。或者,如果它是從更大的程序派生的MCVE。 – kaylum

回答

-1

必須使用2個不同的互斥和你的代碼是這樣

//Thread pair 
{ 
    pthread_mutex_lock(&pairLock) 
    //Do pair job 
    pthread_mutex_unlock(&impairLock) 
} 

//Threa impair 
{ 
    pthread_mutex_lock(&impairLock) 
    //Do impair job 
    pthread_mutex_unlock(&pairLock) 
} 

啓動線程的互斥體必須從1開始(解鎖)和0(鎖定)

另一個

編輯:對所有線程使用相同的互斥體使得只有一個線程可以完成它的工作,但不強制任何順序或替代(取決於系統調度程序)。在你的情況下,genimpair可以先執行,如果調度程序這麼說,但它不會被genpair中斷,在下一個循環中它可能是同一命令或不是

+0

我仍然無法看到如何我可以使用2個線程n次交替這兩個函數。 – starter

+0

啓動每個線程,然後鎖定和解鎖對應的互斥量,您需要打印所有您想要的數字的次數。像'for(){lock();工作();解鎖();}' –

+1

您的解決方案無法工作,因爲兩個線程可以同時輸入他們的工作!第一次獲得'pairLock'和第二個'impactorLock',他們是兩個不同的鎖! –

1

你不能確保哪個線程能夠先於另一個線程通過只有互斥體。只有一個互斥體才能確保只有一個線程能夠運行關鍵代碼。您可以使用關聯到你的互斥條件變量,使他們通過一個接一個,如下面的僞代碼:

// thread1 
do { 
    lock(m); 
    while (turn==0) cond_wait(m); // release the key if not my turn, retry until my turn 
    do my job; 
    turn = 0;      // give hand to the other 
    cond_broadcast(m);   // awake threads waiting for key (blocked in lock or cond_wait) 
    unlock(m);     // release the lock 
} while(); 

// thread2 
do { 
    lock(m); 
    while (turn==1) cond_wait(m); 
    do my job; 
    turn = 1; 
    cond_broadcast(m); 
    unlock(m); 
} while(); 

您也可以使用兩個信號在同一工作...

+0

這是忙着等待! –

+0

肯定不是! cond_wait是一個阻塞呼叫。 –