2016-10-28 68 views
0

目前我很困惑,爲什麼下面的代碼不會打印以下:瞭解並行線程

My value is 0 
My value is 1 
My value is 2 

每次我運行此我要麼得到1-2印刷線或沒有,程序只是坐在他們直到我ctrl-c。我覺得這可能與我使用3個不同的線程使用相同的條件變量和互斥量有關,這是否正確?任何解釋都非常感謝。

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

struct id_holder 
{ 
int id; 
}; 

pthread_mutex_t intersectionMutex = PTHREAD_MUTEX_INITIALIZER; 
pthread_cond_t directionCondition = PTHREAD_COND_INITIALIZER; 
struct id_holder * holder; 

void * logic(void* val) 
{ 
    struct id_holder * id_struct = (struct id_holder *) val; 

    pthread_cond_wait(&directionCondition, &intersectionMutex); 
    printf("My value is %d\n", id_struct->id); 
    free(id_struct); 
    return NULL; 
} 

int main(void) 
{ 
    pthread_t threads[3]; 

    for(int i = 0; i <3; i++) 
    { 
     holder = (struct id_holder *) malloc(sizeof(struct id_holder)); 
     holder->id = i; 
     pthread_create(&threads[i], NULL, logic, holder); 
    } 

    for(int i = 0; i < 3; i++) 
    { 
     sleep(1); 
     pthread_cond_signal(&directionCondition); 
    } 

    for(int i = 0; i < 3; i++) 
    { 
     pthread_join(threads[i], NULL); 
    } 

    return 0; 
} 

回答

3

當條件等待或暗示,它必須鎖定下進行,否則,行爲是不可預測的,因爲它可以進入比賽狀態。因此,你的代碼應該是這樣的:

pthread_mutex_lock(&intersectionMutex); 
pthread_cond_wait(&directionCondition, &intersectionMutex); 
pthread_mutex_unlock(&intersectionMutex); 

而對於主一樣(如果你願意,你可以移動,循環外的鎖):

for(int i = 0; i < 3; i++) { 
    sleep(1); 
    pthread_mutex_lock(&intersectionMutex); 
    pthread_cond_signal(&directionCondition); 
    pthread_mutex_unlock(&intersectionMutex); 
} 

依然代碼也不是100%安全的主線程可以在子線程調用等待之前發信號通知狀態。雖然在主函數中由於sleep()而非常不可能,但通常應該有一個變量來確定等待是否真的需要。換句話說,條件不是隊列,但可以用來創建隊列。