我们知道,如果线程获得互斥锁但在它有机会释放它之前,线程被主线程挂起或被调度程序抢占,多线程代码可能会出现死锁?
我是使用 pthread 库的初学者,所以如果我的以下查询/建议的解决方案可能不可行或完全错误,请多多包涵。
void main()
{
thread_create(T1,NULL,thr_function,NULL)
suspend_thread(T1);
acquire_lock(Lock1);<--- //Now here is a possible deadlock if thread_function acquried Lock1 before main and main suspended T1 before its release
//Do something further;
}
void *thr_function(void *val)
{
///do something;
acquire_lock(Lock1);
//do some more things;
//do some more things;
release_lock(Lock1);
}
在我上面的下面的伪代码段中,线程运行时/编译器不能一起工作以确保获得互斥锁的线程是否被挂起/抢占然后它执行一些“清理代码”在它出来之前释放它持有的所有锁。编译器/链接器可以识别线程函数中获取、释放锁的位置,然后当线程在这两个位置之间挂起时(即在获取之后但在释放之前),线程函数中的执行应该通过某种' goto label;
'跳转由运行时插入,label:
线程将释放锁,然后线程被阻塞或发生上下文切换。[我知道如果一个线程获得了超过 1 个锁,那么跳过这些点来释放这些锁可能会变得混乱......]
但是基本的想法/问题是线程函数能否在它被阻塞或退出执行状态等待或其他状态之前为互斥锁、信号量执行必要的释放锁?