2010-10-15 70 views
2

我正在編寫一些關鍵部分的程序。事情是我需要檢查一個if語句中的互斥量的值。C Pthreads互斥量值?

我願做這樣的事情:

if pthread_mutex(&mutex) == 0 // locked 
    // Do something 
else if pthread_mutex(&mutex) == 1 // unlocked 
// Do something else 

這可能嗎?

回答

6

你想pthread_mutex_trylock()

從該鏈接:

的pthread_mutex_trylock()函數應當相當於pthread_mutex_lock()的,所不同的是,如果由互斥引用的互斥對象當前被鎖定(由任何線程,包括當前線程),呼叫應立即返回。 ... 返回值 ... 如果由互斥引用的互斥對象上的鎖被獲取的pthread_mutex_trylock()函數將返回零。否則,返回一個錯誤編號,以指示錯誤

所以,你的代碼會是這樣的:

pthread_mutex_t *m = /* ... */; 

if (pthread_mutex_trylock(m) == 0) 
{ 
    /* Success! This thread now owns the lock. */ 
} 
else 
{ 
    /* Fail! This thread doesn't own the lock. Do something else... */ 
} 
+0

是的,如果成功的話,再解鎖。 PS:我與作戰昨天:http://stackoverflow.com/questions/3931026/how-can-i-synchronize-three-threads – slashmais 2010-10-15 06:01:34

+0

謝謝!我非常肯定這會工作得很好。 – 2010-10-15 06:07:58

+0

我可以評估鎖定而不鎖定它嗎?我想評估一個鎖,然後根據一個鎖徵收一個sem_wait/post。 – 2010-10-15 07:02:37

0

如果你想知道你的互斥鎖已經鎖定,我建議你使用pthread_mutex_trylock。請記住,鎖定互斥鎖是一項繁重的操作,您不應該鎖定它來測試它是否不是。

2

不,你不應該這樣做。我認爲,pthread互斥體是爲了規範對某些關鍵資源的本地訪問而制定的,如果在某個地方你的程序不知道這個實際線程是否持有鎖定,那麼你使用的是錯誤的工具。我看到了兩個備選方案:

  • 保持在那裏你保持 函數的棧可變軌道,這是 這裏被鎖定,或者如果真的有必要 店線程ID,並比較 是
  • 開關到sem_t作爲控制DS。他們 沒有粘到一個特定的線程 「持有」他們是 的這種限制,但基於令牌的,所以 即獲得了令牌可以 做到這一點,需要工作的任何線索。 (但要小心,並檢查這些程序可以中斷函數的返回值。)
+0

我試圖使用兩者的組合,解決這個問題相當麻煩。我可能需要重新整理整個解決方案。 – 2010-10-15 07:04:02