2012-04-21 75 views
5

我使用pthread_mutex_trylock鎖定在一個結構中的互斥體,它只能被稱爲訪問/由單個線程在給定的時間進行修改。如果互斥鎖已經鎖定,我只是從例程返回而不是排隊/阻塞。`pthread_mutex_trylock`塊時,通過兩個線程在同一時間

這是我的代碼基本輪廓:

typedef struct { 
    pthread_mutex_t m; 
} myStruct; 

void setupStruct(myStruct* struc) { 
    pthread_mutex_init(&struc->m, NULL); 
} 

void structOp(myStruct* struc) { 

    printf("structOp(): Trying to lock\n"); 

    if(pthread_mutex_trylock(&struc->m) != 0) { 
     printf("structOp(): Lock failed\n"); 
     return; 
    } else { 
     printf("structOp(): Locked\n"); 
     // do some stuff to struct 
     pthread_mutex_unlock(&struc->m); 
    } 
} 

的結構被初始化一次這樣的:

myStruct* struc = malloc(sizeof(struc)); 
setupStruct(struc); 

但是,有時,當兩個線程同時調用一個子程序兩個通話到trylock似乎阻止。我假設這是因爲它同時打印兩個線程的「試圖鎖定」,但不打印互斥鎖是否被鎖定。我原本的pthread_mutex_lock有這個問題,所以嘗試了非阻塞版本的原因,但它似乎仍然阻塞。

這並不總是會發生,但當它發生時,它始終會調用該例程的前兩個。如果前兩個調用運行良好,則後續調用也可以正常工作。

這有什麼理由阻止?我是否錯誤地認識到由於其他問題而導致的阻塞?如果問題可能在別處,我可以發佈我的代碼的其他部分。

+1

沒有理由來阻止,AFAIK。其他地方可能有些問題。 – Mat 2012-04-21 09:53:00

+1

什麼叫setupStruct()?有沒有機會召集一次以上? – 2012-04-21 10:10:00

+0

在新線程啓動之前,它肯定只調用一次。我認爲如果出現問題,最有可能使用指針。這些看起來是否正確?我用'myStruct * struc = malloc(sizeof(struc));'分配結構。我會用這個信息更新這個問題。 – Matt 2012-04-21 10:32:30

回答

8

此行是錯誤的:

myStruct* struc = malloc(sizeof(struc)); 

它不alloate足夠的內存,所以你可能搗毀/重用內存中訪問互斥。使用sizeof(struc)struc類型分配內存,並struc類型爲myStruct*,所以你只分配內存足以容納一個指針(ielikely只是4或8個字節)

你應該做

myStruct* struc = malloc(sizeof *struc); 

myStruct* struc = malloc(sizeof(myStruct)); 
+0

哇,我一直在分配我的結構錯誤很長一段時間..感謝解釋! – Matt 2012-04-21 12:06:55

0

這是某種時序問題或內存損壞。無論哪種方式,它都與您發佈的代碼無關,因此無法回答此問題。

如果您的操作系統支持valgrind,請使用memcheckhelgrind模塊檢查您的應用程序。