1. C++ / Говнокод #1618

    +12.2

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    TMutex CriticalGlobalRTOSMutex;
    
    ...
    
    void CriticalDoing()
    {
    	CriticalGlobalRTOSMutex.Lock();
    
    	...
    
    	if( !HorriblyDoing(...) )
    	{
    		throw FatalException;
    	};
    
    	...
    
    	CriticalGlobalRTOSMutex.UnLock();
    };
    
    ...

    Мне уже страшно...

    Запостил: Говногость, 18 Августа 2009

    Комментарии (10) RSS

    • Mutex.Lock() + throw? сурово. здравствуй Deadушка Лок.
      Ответить
      • Это хорошо, что тут видна генерация исключения, а если она произойдёт где-то в вызываемой функции?
        Ответить
      • С чего ты взял что будет deadlock? Может по FatalException мы вываливаемся нахрен из программы, зачем при этом разлочивать мутекс? Без контекста на говнокод не тянет, обычный хреновый код.
        Ответить
        • Может вываливаемся, а может и не вываливаемся. Используйте RAII и будет вам благо.
          Ответить
        • RTOS - видимо это в системе реального времени, так что это не круто.
          Ответить
          • RTOS как бы говорит о том, что требования к коду могут быть самые экзотические.
            Например, FatalException означает что все горит, и надо срочно включать систему пожаротушения. А мутекс разлочивать нельзя, потому как устройство, соответствующее ему, уже сгорело.
            Ответить
        • >CriticalGlobal
          Это как бе намекает нам, что если выйти из программы, то страшный мьютекс никогда не освободится. Чем не контекст?
          Ответить
          • CriticalGlobal может говорить и о том, что в случае ошибки здесь стоит склеить ласты и вывалиться, и пофиг на мутекс. И например scoped lock может быть здесь совершенно не нужен.

            Или как вариант - в случае exception мутекс разлочивать ни в коем случае нельзя, его будет разлочивать обработчик исключений.
            Ответить
    • Сразу бы так писал :D
      CriticalGlobalRTOSMutex.Lock();
      return;
      CriticalGlobalRTOSMutex.UnLock();
      Ответить
      • Вот поэтому нужно зашивать Mutex в класс, чтобы в деструкторе сразу unlock был.
        Ответить

    Добавить комментарий