2012-12-22 41 views
2

我正在學習在Linux編程中使用互斥鎖。我遇到了trylock函數,它首先檢查互斥鎖是否可用,否則鎖定,它會返回。Linux中的pthread_mutex_trylock()

現在我的問題是:

  • 是否達到函數結束而不執行關鍵部分,當的tryLock被調用後返回?
  • 爲什麼不在我的代碼中打印errno

下面是代碼:

int main() 
{ 
pthread_t tid[5]; 

int i; 

if(pthread_mutex_init(&mutex,NULL)) 
    printf("Failed to lock the mutex\n"); 
for(i=0;i<5;i++) 
{ 
    if(pthread_create(&tid[i],NULL,func,&i)) 
     printf("Failed to create a thread\n"); 

    if(errno==EBUSY) 
     printf("thread busy\n"); 

} 

for(i=0;i<5;i++) 
{ 
    if(pthread_join(tid[i],NULL)) 
     printf("Failed to wait for thread %d\n",i); 
} 

printf("All threads terminated\n"); 

return 0; 
} 

void *func(void * arg) 
{ 
int i=*(int *)arg; 

if(pthread_mutex_trylock(&mutex)==0) 
{ 
    sleep(5); 
printf(" i is %d\n",i); 

pthread_mutex_unlock(&mutex); 
} 
else 
    if(errno== EBUSY) 
      printf("thread busy\n"); 
} 

對不起格式更少的代碼..

問候

回答

1

pthread_mutex_trylock()不設置errno - 您只需使用返回值:

int result = pthread_mutex_trylock(&mutex); 

if(result==0) 
{ 
    sleep(5); 
    printf(" i is %d\n",i); 

    pthread_mutex_unlock(&mutex); 
} 
else 
    if (result == EBUSY) 
      printf("thread busy\n"); 
} 
+0

如果我想讓每個線程都應該執行關鍵部分,我可以將trylock函數放在一個循環中直到結果!= EBUSY ..這是否有效? – Alfred

+0

它確實設置errno其實http://publib.boulder.ibm.com/infocenter/zos/v1r12/index.jsp?topic=%2Fcom.ibm.zos.r12.bpxbd00%2Fptmtylk.htm –

+1

@Uzair:請參閱http ://pubs.opengroup.org/onlinepubs/007904875/functions/pthread_mutex_lock.html'pthread_mutex_trylock()'的行爲與Linux上POSIX規範(和我的答案)所描述的一樣; IBM文檔顯然是專門針對zOS的。 –

0

pthread_mutex_trylock的文檔說,如果鎖定互斥鎖無法完成,它將返回錯誤代碼,但它不會將errno設置爲EBUSY。爲了得到預期的結果,你應該做

int rc; 
if((rc = pthread_mutex_trylock(&mutex))==0) { 
    sleep(5); 
    printf(" i is %d\n",i); 

    pthread_mutex_unlock(&mutex); 
} else { 
    printf("thread busy: %s\n", strerror(rc)); 
} 
0

是否達到函數結束而不執行關鍵部分,當的tryLock被調用後返回?

如果pthread_mutex_trylock(&mutex)是成功的(即它返回0),那麼第一部分(即關鍵部分)將被執行並且函數將返回。如果pthread_mutex_trylock(&mutex)不成功(即它返回-1),則將執行其他部分,並且希望打印thread busy,並且函數將返回而不執行關鍵部分。

爲什麼不在下面的代碼中打印errno?

要麼打電話給pthread_mutex_trylock(&mutex)總是成功的,如果你看到所有的i值(即1-5)被打印,那就是這種情況。或者,errorno不是EBUSY,您可以通過在if(errno== EBUSY)之前打印某些內容來檢查。