在互斥代码中发生死锁

时间:2011-10-02 21:45:32

标签: c mutex deadlock

我开发了一个用户级线程库。在代码中,有时会发生死锁,但我无法弄清楚它为什么会发生。以下是互斥锁定和解锁功能的代码:

int gtthread_mutex_lock(gtthread_mutex_t *mutex)
{
   if(!mutex) //checks if mutex is null
       return -1;
   while(mutex->available==1); //spin locks if mutex is already locked by someone else
   __sync_val_compare_and_swap(&mutex->available,0,1); //atomic function to swap value 0 with 1 
   mutex->owner=node->th;
   return 0;
}

int gtthread_mutex_unlock(gtthread_mutex_t *mutex)
{
    if(!mutex) return -1;

    if(mutex->available)
    {
        mutex->available=0;
        mutex->owner=NULL;
    }
    return 0;
}

1 个答案:

答案 0 :(得分:1)

另一个线程可能会获得while测试和交换之间的锁定。

你必须检查__sync_val_compare_and_swap的回复,并重申它是否成功。

此外,您跟踪所有者的代码也不起作用,因为在您的解锁中,您可能会删除其他线程所写的信息。

最好你只有一个字段(用原子操作处理),它保存所有者的信息,如果没有则为0。