2011-05-19 106 views
4

這兩者之間有什麼區別?互斥鎖與pthread_join之間的區別

它們不是同一件事情,它們都在等待線程完成之前執行另一個線程?

我試圖理解下面的代碼

#include <stdio.h> 
#include <stdlib.h> 
#include <pthread.h> 

void *functionC(); 
pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER; 
int counter = 0; 

main() 
{ 
    int rc1, rc2; 
    pthread_t thread1, thread2; 

/*Create independent threads each of which will execute functionC */ 

    if((rc1=pthread_create(&thread1, NULL, &functionC, NULL))) 
    { 
     printf("Thread creation failed: %d\n", rc1); 
    } 

    if((rc2=pthread_create(&thread2, NULL, &functionC, NULL))) 
    { 
     printf("Thread creation failed: %d\n", rc2); 
    } 

    /* Wait till threads are complete before main continues. Unless we */ 
    /* wait we run the risk of executing an exit which will terminate */ 
    /* the process and all threads before the threads have completed. */ 

    pthread_join(thread1, NULL); 
    pthread_join(thread2, NULL); 

    exit(0); 
}  
void *functionC() 
{ 
    pthread_mutex_lock(&mutex1); 
    counter++; 
    printf("Counter value: %d\n",counter); 
    pthread_mutex_unlock(&mutex1); 
} 

感謝。

+3

它們並不特別相似。這有點像問蘋果和供應方經濟學之間的區別。 – tylerl 2011-05-19 04:05:00

回答

3

pthread_join()等待一個線程退出。 mutex_lock獲取控制信號量的控制,防止協作線程同時訪問受保護資源。

8

它們實際上不是一回事。

互斥量(互斥信號量)是一種限制一次使用資源到一個線程的方法(兩個線程顯然都可以運行)。當線程從pthread_mutex_lock調用中成功返回時,它保證是唯一保持該鎖的線程。任何嘗試在該點後鎖定該互斥鎖的線程通常都必須等待,直到擁有的線程將其解鎖。

換句話說,帶鎖的線程是唯一能夠操縱該鎖保護的資源的線程(當然,假設其他線程沒有先獲取鎖就不會觸摸資源 - 您必須玩規則)。

另一方面,一個pthread_join,允許一個線程等待另一個線程退出這通常在主線程中用於等待所有子線程退出(還有其他用途,這只是一個典型的線程)。 pthread_join成功返回意味着另一個線程不再運行。

在您顯示的代碼中,兩個線程同時運行,並且counter增量和printf的調用都受到mutex1的保護。在main末尾的pthread_join調用將使主線程等待,直到你的兩個子線程退出,然後繼續。

另外,您應該檢查pthread_mutex_lock的返回值,因爲它可以失敗。在這種情況下,您不想繼續修改受保護的資源,因爲可能發生損壞。同上pthread_join

而且,爲了更全面的測試,下面的功能會更好:

void *functionC() { 
    int i; 
    for (i = 1000; i > 0; i--) { 
     pthread_mutex_lock (&mutex1); 
     counter++; 
     printf ("Counter value: %d\n", counter); 
     pthread_mutex_unlock (&mutex1); 
    } 
} 

,因爲它會更容易有線程運行並排側。如果沒有循環,在第二個線程開始之前,一個線程很可能會退出。

+0

^按資源你是指一個正在使用該線程的變量? – John 2011-05-19 03:38:28

+1

@泰德,這就是一個例子。但是一個互斥鎖可以用來保護變量,防止代碼在兩個線程中同時運行,停止輸出到終端被多線程和其他許多事物混合在一起。 – paxdiablo 2011-05-19 03:42:12

+0

除非實現爲'pthread_mutex_lock'定義了額外的錯誤條件,或者您正在使用特殊的互斥類型(如錯誤檢查或健壯性),否則'pthread_mutex_lock'可能會失敗。如果在特定於實現的錯誤上失敗,我不知道如何處理這個問題。我認爲除了使用健壯的互斥鎖之外,不檢查返回值是非常合理的。 – 2011-05-19 11:54:11