作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我开发了一个用户级线程库。在代码中,有时会发生死锁,但我无法弄清楚为什么会发生。以下是互斥锁定和解锁功能的代码:
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;
}
最佳答案
另一个线程可能会获取您的 while
测试和交换之间的锁。
您必须检查 __sync_val_compare_and_swap
的返回结果,如果未成功则重复。
此外,用于跟踪所有者的代码将不起作用,因为在解锁过程中,您可能会删除其他线程写入的信息。
最好只有一个字段(用原子操作处理)来保存所有者的信息,如果没有,则为 0。
关于c - 互斥锁代码中发生死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7629432/
我是一名优秀的程序员,十分优秀!