以下是gdb的一些输出。在我看来,这里运行的线程实际上并没有获得锁定。
120 pthread_mutex_lock(&queue_p->lock);
(gdb) p queue_p->lock->__data->__owner
$45 = 0 //This makes sense; the instruction hasn't run yet.
(gdb) n
121 if (queue_p->back == NULL) {
(gdb) p queue_p->lock->__data->__owner
$46 = 0 // What?
发生这种情况时,没有其他线程在运行。它只是一行代码,但它没有按照我的预期运行。这可能意味着我的期望是错误的。谁能让我迷惑?
编辑:希望这对其他人有用。我错过的是主线程在创建线程后继续执行。这对我来说很明显,但在我发布这个问题的时候,我受到了编写单线程程序代码的一生的影响。
所以我的代码创建了线程,每个线程都试图获取这个互斥锁。但在他们可以之前,主线程已经完成,其中包括销毁互斥锁。我专注于显示的代码,并没有完全理解它不是唯一运行的代码。