操作系統:Linuxpthread_mutex_timedlock不超時
LIB:glibc的
我有訪問一塊硬件,我通過使用一個互斥防止爭用的多個線程。
該軟件非常複雜,並且由於遞歸調用鎖,可能會導致系統死鎖。出於這個原因,我正在使用'pthread_mutex_timedlock'而不是'pthread_mutex_lock'。我寧願打印一條錯誤消息,然後繼續導致系統看門狗和復位。這可以讓我看到這個問題,而不會使系統失效。
這裏有一段代碼應該可以幫助你理解我正在嘗試做什麼。
pthread_mutex_t MainMutex = PTHREAD_MUTEX_INITIALIZER;
#define m_TAKE_LOCK() { \
struct timespec abs_time; \
clock_gettime(CLOCK_REALTIME , &abs_time); \
abs_time.tv_sec += 5; \
if (pthread_mutex_timedlock (&MainMutex, &abs_time) != 0) \
{ \
printf("Lock failed PID %d %s\n", getpid(), __func__); \
} \
}
#define m_RELEASE_LOCK() pthread_mutex_unlock(&MainMutex);
void func1(void) {m_TAKE_LOCK()}
void func2(void) {m_TAKE_LOCK()}
void main(void)
{
while (1)
{
func1();
func2();
m_RELEASE_LOCK()
...
}
}
還有其他線程也採取鎖,但這不是一個問題。我遇到的問題是永遠不會出現鎖定超時。它永遠在等待,並監督這個系統,這正是我想要避免的。
'abs_time.tv_sec'是正確的 - 我已經打印了它,系統時鐘已經被我嘗試和使用它的時間初始化了。
我知道Windows將阻止同一進程的鎖定,但Linux沒有這種保護。我意識到我不應該遞歸調用m_TAKE_LOCK(),但使用timedlock的目的是捕捉錯誤(打印消息並繼續)。
任何人都知道我可能做錯了什麼?
如果您使用`pthread_mutexattr_settype(3posix)`將互斥鎖設置爲鍵入`PTHREAD_MUTEX_RECURSIVE`,您應該能夠在單個線程中遞歸獲取您的鎖。 – sarnold 2011-12-17 01:09:06
樣式問題:您應該使用`do {...} while(0)`而不是`{...}`,因爲它允許將`;`附加到它的調用 - 這更好。並將它用於TAKE和RELEASE。 – fge 2011-12-17 01:10:31