今天大神同事遇到一个问题,如下:
如果两个线程共用一个线程锁,在A线程里面申请两次这个锁,B线程里释放一次,那么程序会正常运行吗,还是会阻塞在某个地方?
场景1:时间片竞争,各线程对锁的操作先后顺序未知
[root@zxx ~/testcode]$./pthreadlock
thread two count value is 1
unlock thread two count value is 1
thread one count value is 1
lock1 thread one count value is 2
测试结果如上所示:线程二先释放锁,线程1申请锁成功,但是由于一直没有释放,因此在第二次申请锁的地方等待
场景2:通过sleep让线程1先申请锁,线程二再释放
[root@zxx ~/testcode]$./pthreadlock
thread one count value is 1
lock1 thread one count value is 2
thread two count value is 2
unlock thread two count value is 2
lock2 thread one count value is 3
可以看到线程1先上锁了,紧接着线程2释放锁,线程1又申请锁,奇怪的是代码并没有在此等待锁的再次释放,正常执行完退出了。
对于锁的使用有很多种,也可以通过设置线程锁的性质来避免一些意外情况。经过进一步沟通,项目中的使用方式是在A线程发送数据包,B线程收到数据包之后解锁,那么实际情况跟场景二类似。但是还是不太理解为什么这么使用线程锁,唉,菜鸟一只,慢慢学习吧
<
本文探讨了当两个线程共享一个线程锁时可能出现的死锁问题。在不同时间片竞争下,线程的锁操作顺序不确定可能导致一个线程在第二次申请锁时阻塞。而在特定顺序下,线程可以连续获取并释放锁,但这种用法可能引发疑问。通过案例分析,作者展示了如何理解和避免此类问题,强调了正确使用线程锁的重要性。
最低0.47元/天 解锁文章
1235

被折叠的 条评论
为什么被折叠?



