LINUX.ORG.RU

История изменений

Исправление 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 от остальных указателей.