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

    +142

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    class cout_mt : public std::ostringstream
    {
    public:
       ~mt_ostream()
       {
          std::cout << str();
       }
    };
    
    #define cout static_cast<cout_mt&>(cout_mt())

    Для того чтобы не разрывались строки вида: cout << "Value = " << value << ";" << endl; при использовании таких вызовов из нескольких тредов, а то ведь каждый оператор << является вызовом функции и частенько треды мешаю друг другу выводить . . .

    Запостил: k06a, 14 Мая 2010

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

    • Что-то не то с именем деструктора или класса кажется. Наверное это погрешность публикации здесь.
      А на счет неразрыва строк, где гарантия, что два деструктора в разных тредах не вызовутся одновременно ?
      Ответить
      • Я склонен считать вызов оператора << для cout атомарной операцией.
        Ответить
        • К сожалению она таковой не является
          Ответить
          • То есть вы считаете, что при длине текста в сотню символов во время вывода на экран за один cout может произойти коллизия между тредами?
            Ответить
            • Конечно. Пусть даже 2 символа. Если доступ к ресурсу, в данном случае консоли, не синхронизировать возможны коллизии.
              Ответить
              • по моему, при флагах /MT и /MTd (начиная с 2008 других флагов нет) cout синхронизируется автоматически... а вот stringstream надо синхронизировать дополнительно...
                Ответить
                • Ну в данном случае к одному объекту обращается только один тред. Это уж точно)) За инфу про флаги и тредо-безопасность cout спасибо, не знал.
                  Ответить
                  • самая быстрая синхронизация это - ее отсутствие...
                    Ответить
      • С деструктором облажался, впредь буду повнимательней
        Ответить

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