我正在編寫一些關鍵部分的程序。事情是我需要檢查一個if語句中的互斥量的值。C Pthreads互斥量值?
我願做這樣的事情:
if pthread_mutex(&mutex) == 0 // locked
// Do something
else if pthread_mutex(&mutex) == 1 // unlocked
// Do something else
這可能嗎?
我正在編寫一些關鍵部分的程序。事情是我需要檢查一個if語句中的互斥量的值。C Pthreads互斥量值?
我願做這樣的事情:
if pthread_mutex(&mutex) == 0 // locked
// Do something
else if pthread_mutex(&mutex) == 1 // unlocked
// Do something else
這可能嗎?
從該鏈接:
的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... */
}
如果你想知道你的互斥鎖已經鎖定,我建議你使用pthread_mutex_trylock
。請記住,鎖定互斥鎖是一項繁重的操作,您不應該鎖定它來測試它是否不是。
不,你不應該這樣做。我認爲,pthread互斥體是爲了規範對某些關鍵資源的本地訪問而制定的,如果在某個地方你的程序不知道這個實際線程是否持有鎖定,那麼你使用的是錯誤的工具。我看到了兩個備選方案:
sem_t
作爲控制DS。他們 沒有粘到一個特定的線程 「持有」他們是 的這種限制,但基於令牌的,所以 即獲得了令牌可以 做到這一點,需要工作的任何線索。 (但要小心,並檢查這些程序可以中斷函數的返回值。)我試圖使用兩者的組合,解決這個問題相當麻煩。我可能需要重新整理整個解決方案。 – 2010-10-15 07:04:02
是的,如果成功的話,再解鎖。 PS:我與作戰昨天:http://stackoverflow.com/questions/3931026/how-can-i-synchronize-three-threads – slashmais 2010-10-15 06:01:34
謝謝!我非常肯定這會工作得很好。 – 2010-10-15 06:07:58
我可以評估鎖定而不鎖定它嗎?我想評估一個鎖,然後根據一個鎖徵收一個sem_wait/post。 – 2010-10-15 07:02:37