|
楼主 |
发表于 2010-1-21 17:54:39
|
显示全部楼层
2. 保持锁的顺序。
将可能同时申请的锁排序,每个锁分配一个序号,申请多个锁时,应该按顺序申请。这样可以避免交叉死锁。
这一模式可以配合Thread-Safe Interface一起使用。例如:
class A2;
class A1 {
public:
void f(A2& a2) {
Guard<LOCK> guard (lock_);
f_i(a2);
}
private:
void f_i(A2& a2) {
// ……
a2.g(); // right! a1's impl function call a2’s interface function
}
};
class A2 {
public:
void g() {
Guard<LOCK> guard (lock_);
g_i();
}
private:
void g_i() {
// ……
}
};
class A3 {
public:
void h(A1& a1,A2& a2) {
Guard<LOCK> guard (lock_);
h_i(a1,a2);
}
private:
void h_i(A1& a1,A2& a2) {
// ……
a1.f(a2); // wrong! a3's impl function call a1’s interface function
}
};
总结:这个方式,简单清晰,而又不失效率。表面看起来似乎对设计有所限制,a1可以call a3,但a3不可以call a1。但是这是为了保证正确的锁顺序,如果a3确实有call a1的需要,即a1 < a3 && a3 < a1,则a1 == a3,可把a1和a3的共享资源合并,划归一个类管理。 |
|