我使用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
有這個問題,所以嘗試了非阻塞版本的原因,但它似乎仍然阻塞。
這並不總是會發生,但當它發生時,它始終會調用該例程的前兩個。如果前兩個調用運行良好,則後續調用也可以正常工作。
這有什麼理由阻止?我是否錯誤地認識到由於其他問題而導致的阻塞?如果問題可能在別處,我可以發佈我的代碼的其他部分。
沒有理由來阻止,AFAIK。其他地方可能有些問題。 – Mat 2012-04-21 09:53:00
什麼叫setupStruct()?有沒有機會召集一次以上? – 2012-04-21 10:10:00
在新線程啓動之前,它肯定只調用一次。我認爲如果出現問題,最有可能使用指針。這些看起來是否正確?我用'myStruct * struc = malloc(sizeof(struc));'分配結構。我會用這個信息更新這個問題。 – Matt 2012-04-21 10:32:30