2011-07-14 73 views
2

我有一個關於mutext處理的基本問題。 我有一個文件出現在2個其他線程(滿分3)。我需要相互排斥線程對它的訪問。所以,我做了以下的從線程1處理程序調用的函數:Pthread Mutex鎖定

int sub_routine_thread1{ 

pthread_mutex_lock(&mut) 
FILE *fp; 
fp = fopen("myfile", "r"); 
if(fp == NULL){ 
return -1; 
} 
pthread_mutex_unlock(&mut) 
return 0; 
} 

正如你可以看到我已經知道,如果文件指針返回NULL,那麼我的互斥被鎖定在這裏和解鎖從未發生過。所以,我把它改成如下:

int sub_routine_thread1{ 

pthread_mutex_lock(&mut) 
FILE *fp; 
fp = fopen("myfile", "r"); 
if(fp == NULL){ 
    pthread_mutex_unlock(&mut) 
    return -1; 
} 
pthread_mutex_unlock(&mut) 
return 0; 
} 

不過這雖然之後我有一種不好的感覺,這是沒有辦法的辦法互斥鎖應該做的。我遇到了一些關於清理處理程序,也許認爲這是我必須編寫:

int sub_routine_thread1{ 
    pthread_cleanup_push(pthread_mutex_unlock, (void *) &mut); 
    pthread_mutex_lock(&mut); 
    FILE *fp; 
    fp = fopen("myfile", "r"); 
    if(fp == NULL){ 
    return -1; 
    } 
    pthread_cleanup_pop(1); 
    return 0; 
} 

這是正確的方式?你能澄清一下嗎?

+0

你想要什麼,以防止?另一個線程在讀取文件時寫入文件?文件中應該是原子的最小工作單元是多少?從文件中讀取一些二進制結構?讀一條線?讀取文件的最後一行?讀整個文件? – ninjalj

回答

1

但是在此之後,雖然我有一種不好的感覺,但這不是互斥鎖定應該完成的方式。

是的。你的第二個例子非常好。當線程被取消時,pthread_cleanup_push被用來運行函數,這不是你應該在這裏使用的。

Allthough,我可能更喜歡做這樣的事情

int sub_routine_thread1() { 
    FILE *fp; 
    int ret = -1; 
    pthread_mutex_lock(&mut) 
    fp = fopen("myfile", "r"); 
    if(fp != NULL){ 
    //do_stuff_unlocked(fp); 
    ret = 0; 
    } 
    pthread_mutex_unlock(&mut) 
    return ret; 
} 
1

所有

if(fp == NULL){ 
    return -1; 
    pthread_mutex_unlock(&mut); /* This is never reached. */ 
} 

if(fp == NULL){ 
    pthread_mutex_unlock(&mut); /* Probably what you want. */ 
    return NULL; 
} 

二:首先,cleanup handlers真的很酷的和有用的,但是當你使用取消了pthread_cancel線程,他們只被調用。當線程正常退出時(而且返回被認爲是正常的)它們不會被調用。

+0

糟糕,當然retun-1應該在解鎖之後。那是一個錯字:)。現在編輯它。 – user489152

+0

但是這種解鎖方式建議嗎? – user489152

+1

你這樣做的方式?我看不出有什麼不好。但是,如果您需要取消線程,請閱讀「清理處理程序」。 – cnicutar