История изменений
Исправление bugfixer, (текущая версия) :
Для каждого вида захваченного мьютекса можно описать отдельный тип.
Что, очевидно, приводит к code-bloat.
Это гарантирует правильный мьютекс.
Если бы:
class MyClass {
private:
// note - the whole thing is as private as it could be
Mutex mutex_;
class MyLockHolder {
MyLockHolder(MyClass&) { // lock mutex_; }
~MyLockHolder() { // unlock mutex_; }
};
void do_something_locked(const MyLockHolder&) {...}
void do_something() {
const MyLockHolder lock(*this);
do_something_locked(lock);
}
void do_something_bad(MyClass& other) {
const MyLockHolder badLock(other);
do_something_locked(badLock);
}
};
И абсолютно ничего Вы с этим в compile time сделать не сможете в отсутствие языковых средств позволяющих отличать this от остальных указателей.
Исправление bugfixer, :
Для каждого вида захваченного мьютекса можно описать отдельный тип.
Что, очевидно, приводит к code-bloat.
Это гарантирует правильный мьютекс.
Если бы:
class MyClass {
private:
// note - the whole thing is as private as it could be
Mutex mutex_;
class MyLockHolder(MyClass&) {
// lock the mutex in ctor, unlock in dtor
};
void do_something_locked(const MyLockHolder&) {...}
void do_something() {
const MyLockHolder lock(*this);
do_something_locked(lock);
}
void do_something_bad(MyClass& other) {
const MyLockHolder badLock(other);
do_something_locked(badLock);
}
};
И абсолютно ничего Вы с этим в compile time сделать не сможете в отсутствие языковых средств позволяющих отличать this от остальных указателей.
Исходная версия bugfixer, :
Для каждого вида захваченного мьютекса можно описать отдельный тип.
Что, очевидно, приводит к code-bloat.
Это гарантирует правильный мьютекс.
Если бы:
class MyClass {
private:
// note - the whole thing is as private as it could be
Mutex mutex_;
class MyLockHolder(MyClass&) {
// lock the mutex in ctor, unlock in dtor
};
void do_something_locked(const MyLockHolder&) {...}
void do_something() {
const MyLockHolder lock(*this);
do_something_locked(lock);
}
void do_something_bad(MyClass& other) {
const MyLockHolder badLock(other);
do_something(badLock);
}
};
И абсолютно ничего Вы с этим в compile time сделать не сможете в отсутствие языковых средств позволяющих отличать this от остальных указателей.