叫說我有一類A
:一定保障私有函數只能從鎖定狀態
class A {
public:
A();
void fetch_data() { return 1; }
void write_x_data() {
// lock this instance of A
private_function1_which_assumes_locked();
private_function2_which_assumes_locked();
// unlock this instance of A
}
void write_y_data() {
// lock this instance of A
private_function1_which_assumes_locked();
// unlock this instance of A
}
private:
void private_function1_which_assumes_locked();
void private_function2_which_assumes_locked();
};
我想保證,除非A
被鎖定private_function*_which_assumed_locked()
永遠不能被調用。
什麼是實現這一目標的最佳方式是什麼?我有5個左右的需要鎖定的公共功能。這些功能永遠不會互相呼應,所以我並不擔心這些會導致死鎖。綜合起來,這5個公共函數調用了大約15個不同的私有函數,它們需要假設對象處於鎖定狀態。顯然,我不能鎖定私有函數,因爲我會陷入僵局。
隨意提供合理的高層次抽象的答案,假設Mutexes和Scopeguards的存在。
在Python我可能會做一些像這與decorators:
class locked_method(object):
def __init__(self, f):
self.f = f
def __call__(self):
# Do whatever is needed to lock
self.f()
# Do whatever is needed to unlock
class checklocked(object):
def __init__(self, f):
self.f = f
def __call__(self):
# check locked, if not, don't call self.f(),
# and yell at me loudly for screwing up.
self.f()
@locked_method
def func1():
__function_which_assumes_locked()
@checklocked
def __function_which_assumes_locked():
pass
注:我沒有在Python的方式做了很多工作,可以隨意評論,如果我的Python是錯誤/愚蠢,但這個問題的重點更多的是在C++中完成這種事情的最好方式,所以希望Python提供的內容足以讓你知道我想做什麼。
遞歸(可重入)互斥體呢? – Arkadiy 2009-11-20 16:15:48
@Arkadiy - 有趣的想法。碰巧我沒有訪問遞歸互斥類,但如果這是唯一的方法去,那麼我想我必須找到一個。任何其他想法? – 2009-11-20 16:21:38