防止代码死锁的常见解决方案是确保锁定顺序以通用方式发生,而不管哪个线程正在访问资源.
例如,给定线程T1和T2,其中T1访问资源A然后B和T2访问资源B然后A.按照需要的顺序锁定资源会导致死锁.简单的解决方案是锁定A然后锁定B,无论订单特定的线程将使用哪些资源.
问题情况:
Thread1 Thread2
------- -------
Lock Resource A Lock Resource B
Do Resource A thing... Do Resource B thing...
Lock Resource B Lock Resource A
Do Resource B thing... Do Resource A thing...
Run Code Online (Sandbox Code Playgroud)
可能解决方案
Thread1 Thread2
------- -------
Lock Resource A Lock Resource A
Lock Resource B Lock Resource B
Do Resource A thing... Do Resource B thing...
Do Resource B thing... Do Resource A thing...
Run Code Online (Sandbox Code Playgroud)
我的问题是在编码中使用了哪些其他技术,模式或常用做法来保证死锁预防?
我对并发很新,我在决定如何使用互斥锁时遇到了麻烦.目前,它们遍布我的代码,两个线程相互作用.这种互斥体的使用是否合适?
class Foo
{
public:
void SetMember(int n) { AcquireMutex(..); n_ = n; ReleaseMutex(...);}
private:
Thread()
{
while(1)
{
AcquireMutex(..);
// Do something with n_
ReleaseMutex(...);
}
}
};
Run Code Online (Sandbox Code Playgroud)
我有很多数据成员可以通过不同的线程从外部读取和设置,我发现跟踪所有获取和释放互斥锁是一件令人头痛的问题.