典型情况下,如果task1持有锁A想要取得锁B,而另一个task2取得了锁B并且正在等待task1持有的锁A,则会导致死锁。pthread_mutex_timedlock和死锁
但是,当涉及到pthread_mutex_timedlock时,它将在指定的超时后尝试互斥锁或超时。
我碰到了死锁的情况,我试图采取定时锁,最终会超时,这让我很困惑。
编辑:死锁可以通过具有更好的设计,这是我落得这样做,我确信,采取互斥锁的顺序是一样的,避免死锁 但问题仍然开放,这就是如果要避免可以避免死锁,因为我选择了timedlock
有人能解释我这种行为吗?
编辑:附加的样本代码,使场景更加清晰(真正的任务是相当复杂的,并运行到千行)
T1
pthread_mutex_lock(&lockA);
//call some API, which results in a lock of m2
pthread_mutex_lock(&lockB);
//unlock in the order
pthread_mutex_unlock(&lockB);
pthread_mutex_unlock(&lockA);
T2
pthread_mutex_lock(&lockB);
//call some API, which results in locking m1
pthread_mutex_timedlock(&lockA,<10 sec>);
崩溃在T2的背景下看到,bt:
Program terminated with signal 6, Aborted.
#0 0x57edada0 in raise() from /lib/libc.so.6
(gdb) bt
#0 0x57edada0 in raise() from /lib/libc.so.6
#1 0x57edc307 in abort() from /lib/libc.so.6
#2 0x57ed4421 in __assert_fail() from /lib/libc.so.6
#3 0x57bb2a7c in pthread_mutex_timedlock() from /lib/libpthread.so.0
我跟踪误差以下
pthread_mutex_timedlock: Assertion `(-(e)) != 35 || (kind != PTHREAD_MUTEX_ERRORCHECK_NP && kind != PTHREAD_MUTEX_RECURSIVE_NP)' failed.
很难说没有看到任何代码。 –
我增加了一些信息。希望有帮助 – rajshenoy
也许我错误地理解了你的问题,但是我不清楚你是否理解超时是等待*获得锁的时间,而不是实际持有锁的时间。这是你问题的根源还是我误解了你对这个问题的多次编辑所说的话? – Duck