我开发了一个用户级线程库。在代码中,有时会发生死锁,但我无法弄清楚它为什么会发生。以下是互斥锁定和解锁功能的代码:
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;
}
答案 0 :(得分:1)
另一个线程可能会获得while
测试和交换之间的锁定。
你必须检查__sync_val_compare_and_swap
的回复,并重申它是否成功。
此外,您跟踪所有者的代码也不起作用,因为在您的解锁中,您可能会删除其他线程所写的信息。
最好你只有一个字段(用原子操作处理),它保存所有者的信息,如果没有则为0。