无法解释的pthread互斥锁死锁

时间:2013-02-12 22:23:48

标签: c multithreading thread-safety pthreads mutex

我的应用程序中似乎存在由特定互斥锁导致的死锁。但是,代码在锁定后几乎立即解锁了互斥锁,并且锁和解锁之间没有其他互斥锁依赖关系。互斥锁绝对不会被同一个线程锁定两次。

问题出现在我的应用程序中只有一个(中)用户。我正在处理死锁期间生成的核心转储。等待的线程没有出现在核心转储中,但是代码告诉我他们都没有锁定有问题的互斥锁。这是持有锁的线程的回溯:

(gdb) bt
#0  0x0000003aa4e0e054 in __lll_lock_wait () from /lib64/libpthread.so.0
#1  0x0000003aa4e09388 in _L_lock_854 () from /lib64/libpthread.so.0
#2  0x0000003aa4e09257 in pthread_mutex_lock () from /lib64/libpthread.so.0
#3  0x000000000043cf59 in my_processor (myvar=0x7fff36ba7430, mystring=0x7fff36ba76c0 
"This is a string")

我还打印了相关互斥锁的数据:

(gdb) print my_mutex
$4 = {__data = {__lock = 2, __count = 0, __owner = 0, __nusers = 0, __kind = 2, __spins = 0, __list = {__prev = 0x0, __next = 0x0}},
  __size = "\002", '\000' <repeats 15 times>, "\002", '\000' <repeats 22 times>, __align = 2}

这似乎不一致:所有者为0,表示没有线程拥有锁,但线程阻塞等待互斥锁。

以下代码段显示了互斥锁的声明和初始化:

pthread_mutex_t my_mutex;
pthread_mutexattr_t mutex_attr;

/* set up mutex attributes */
pthread_mutexattr_init(&mutex_attr);
pthread_mutexattr_settype(&mutex_attr, PTHREAD_MUTEX_ERRORCHECK);

/* create mutex */
pthread_mutex_init(&my_mutex, &mutex_attr);

/* destroy mutex attributes */
pthread_mutexattr_destroy(&mutex_attr);

这个问题可能是什么原因?

0 个答案:

没有答案