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

    +18

    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
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    77. 77
    78. 78
    79. 79
    80. 80
    81. 81
    82. 82
    83. 83
    84. 84
    85. 85
    86. 86
    87. 87
    88. 88
    89. 89
    90. 90
    91. 91
    //main.cpp:
    #define THREAD_COUNT 2
    #include "winparallel.h"
    
    main1()
    {
        lock(1);
        int i=0; while(i++<10)
        printf("1: %d\n", i);
        unlock(1);
    }
    
    main2()
    {
        lock(1);
        int i=0; while(i++<10)
        printf("2: %d\n", i);
        unlock(1);
    }
    
    main3(){};
    main4(){};
    main5(){};
    main6(){};
    main7(){};
    main8(){};
    
    
    
    //=====================================================================================
    //winparallels.h:
    #include <windows.h>
    #define _MAX_CORES 8
    LPVOID _void;
    #define main1() DWORD WINAPI _main1(LPVOID lpParam)
    #define main2() DWORD WINAPI _main2(LPVOID lpParam)
    #define main3() DWORD WINAPI _main3(LPVOID lpParam)
    #define main4() DWORD WINAPI _main4(LPVOID lpParam)
    #define main5() DWORD WINAPI _main5(LPVOID lpParam)
    #define main6() DWORD WINAPI _main6(LPVOID lpParam)
    #define main7() DWORD WINAPI _main7(LPVOID lpParam)
    #define main8() DWORD WINAPI _main8(LPVOID lpParam)
    DWORD WINAPI _main1(LPVOID);
    DWORD WINAPI _main2(LPVOID);
    DWORD WINAPI _main3(LPVOID);
    DWORD WINAPI _main4(LPVOID);
    DWORD WINAPI _main5(LPVOID);
    DWORD WINAPI _main6(LPVOID);
    DWORD WINAPI _main7(LPVOID);
    DWORD WINAPI _main8(LPVOID);
    HANDLE _locks[_MAX_CORES];
    int _argc; char **_argv;
    void lock(int n) { DWORD res = WaitForSingleObject(_locks[n], INFINITE); }
    void unlock(int n) { ReleaseMutex(_locks[n]); }
    int main(int argc,char **argv) {
        HANDLE threads[_MAX_CORES];
        DWORD id;
        int THREADS = THREAD_COUNT;
        if (THREADS<=0) {
            SYSTEM_INFO sysinfo;
            GetSystemInfo(&sysinfo);
            THREADS = sysinfo.dwNumberOfProcessors;
            if (THREADS>_MAX_CORES) THREADS = _MAX_CORES;
        }
        _argc = argc; _argv = argv;    
        _locks[0] = CreateMutex(NULL,FALSE,NULL);
        _locks[1] = CreateMutex(NULL,FALSE,NULL);
        _locks[2] = CreateMutex(NULL,FALSE,NULL);
        _locks[3] = CreateMutex(NULL,FALSE,NULL);
        _locks[4] = CreateMutex(NULL,FALSE,NULL);
        _locks[5] = CreateMutex(NULL,FALSE,NULL);
        _locks[6] = CreateMutex(NULL,FALSE,NULL);
        _locks[7] = CreateMutex(NULL,FALSE,NULL);    
        threads[0]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)_main1,NULL,0,&id);
        if (THREADS>=2) 
        threads[1]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)_main2,NULL,0,&id);
        if (THREADS>=3) 
        threads[2]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)_main3,NULL,0,&id);
        if (THREADS>=4) 
        threads[3]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)_main4,NULL,0,&id);
        if (THREADS>=5) 
        threads[4]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)_main5,NULL,0,&id);
        if (THREADS>=6) 
        threads[5]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)_main6,NULL,0,&id);
        if (THREADS>=7) 
        threads[6]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)_main7,NULL,0,&id);
        if (THREADS>=8) 
        threads[7]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)_main8,NULL,0,&id);
        WaitForMultipleObjects(THREADS, threads, TRUE, INFINITE);
        return 0;
    }

    >После этого всё что нужно освоить про потоки - работу с локами. Локи - это скандинавский бог приостановки потока.

    Запостил: LispGovno, 05 Марта 2013

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

    • > Локи - это скандинавский бог приостановки потока.
      А еще здесь не обошлось без бога копипасты... Потоки юзаем, а циклов не знаем...

      P.S. Конструктор лего прям: вот тебе 8 локов и 1-8 потоков, собирай из них говно пирамидку, играйся... Треды для детей 3-5 лет.
      Ответить
    • P.S. Можно линк на происхождение этого ёбаного пиздеца учебного кода? Всяко ведь гейдев?
      Ответить
    • Опять какая-то упоротая хрень, выдуманная не менее упоротыми лисами только по факту того, что эти лисы - могут.
      Жаль, синтетоты слишком много и всё больше и больше. Нормального, не школоло, не PHP, не даты, не, не, не, а вполне промышленного загадочного или смешного кода осталось даже не через раз.
      Ответить
    • Где здесь C++? Почему вместо кошерного boost::thread используется вендоблядство?
      Ответить
      • Кошерные теперь уже std::thread
        Ответить
      • что ты имеешь против винды?
        Ответить
        • против винды - проприетарное поделие с vendor lock-in, secure boot'ами и неюзабельными свистопердящими интерфейсами

          против кода - использование платформозависимых сущностей, plain C style в разделе C++. Не говоря уже про кривой код
          Ответить
          • > неюзабельными свистопердящими интерфейсами
            подробнее
            Ответить
            • Metro UI же
              Ответить
              • А мне, хоть я и недолюбливаю винду, как не странно понравился Metro UI.

                В семерке\висте пуск намноого более убогий. Я вот могу его юзать только как строку поиска... А скроллить его и искать в нем значки, непонятно как раскиданные по папкам - нет уж, увольте.

                Метрошные плеер и ие отлично подходят для отдыха - полный экран, крупное и удобное управление, а что еще нужно? А для работы метро уй майкрософт и не предлагает.
                Ответить
                • > А скроллить его и искать в нем значки, непонятно как раскиданные по папкам - нет уж, увольте.
                  меня устраивает связка Classic Shell + Launchy, решающая все проблемы компактности меню пуск и запуска часто используемых программ с клавиатуры в пару нажатий
                  в пуске причем раскиданы по алфавиту, разве в дефолтном пуске не так?
                  а вот жить совсем без пуска я не готов

                  зы. впрочем, дефолтный пуск в висте/семерке тоже дерьмище, ухудшение пуска у микрософта начались еще с xp, но в той хоть можно было системную галочку выставить "верните мне классический вид, суки"
                  так что неудивительно, что смена одного говна (пуск в семерке) на другое говно (метро уй) пользователями воспринята
                  Ответить
                  • > в пуске причем раскиданы по алфавиту
                    Дык приходится вспоминать какая фирма придумала нужную мне прогу. В той же линухе категории адекватны - игры, разработка, система и т.п. А тут - foobar software, necrosoft corporation и прочие малознакомые личности...

                    > Launchy
                    Да, удобная штука.

                    > ухудшение пуска у микрософта начались еще с xp
                    Да, в хр всегда гонял его на классическом виде.

                    Ну а по метрошному пуску - там хоть можно часто используемые проги разместить на одном экране, и их количество не ограничено десятком как в семерочном пуске...
                    Ответить
                  • >>ухудшение пуска у микрософта начались еще с xp
                    >>дефолтный пуск в висте/семерке тоже дерьмище
                    Не согласен. Мне привычно нажать Win, набрать первые три-четыре буквы названия программы и нажать Enter, а наиболее часто запускаемые программы закрепляются в лаунчере и вызываются по Win+цифра. И мне адски не хватает этих штук, когда я сажусь за машину с установленной хрюшей.
                    Ответить
                    • >набрать первые три-четыре буквы названия программы и нажать Enter,
                      >часто запускаемые программы закрепляются в лаунчере и вызываются по Win+цифра

                      Ну вот я и говорю - попробуй консольные приложения, они заточены под клавиатуру.
                      Ответить
                      • >>попробуй консольные приложения, они заточены под клавиатуру
                        Примерно теми же словами мне сокурсники предлагали попробовать травку :)

                        Пока я писал комментарий про убогость виндового cmd.exe по сравнению с gnome-terminal, вдруг вспомнил про PowerShell. Неужели в Windows появилось подобие нормального терминала?
                        Ответить
                        • Я думал, PowerShell это интерпретатор, а не эмулятор терминала.
                          Ответить
                          • Фейл признаю, а в оправдание напишу, что я был одурманен тем, что в PowerShell сработали ls, pwd, man и можно выставить ширину консоли в 200 колонок.
                            Ответить
                    • M-! explorer
                      - Открыть файл программой зарегистрированой для расширения этого файла.

                      Добавил симлинков в Сигвниновский /usr/bin на всякие папки внутри Program Files (пришлось немножко с UAC побороться, но получилось в итоге).
                      Единственное - что не победил: IIS, эти уроды его положили в Windows/System32 и еще части в Windows/WoW64. И там уже фиг знает, как их рассекретить, искал по регистри, но ничего путнего не нашел. И еще эта урдоская программа все свои файлы настроек создает от имени администратора.

                      Вобщем, жить можно, но не хочется.
                      Ответить
                • > пуск намноого более убогий
                  На восьмёрке я до сих пор не знаю вменяемого способа попасть в панель управления не за пять нажатий.
                  Есть и в пуске свои плюсы, не только относящиеся к списку приложений.
                  Ответить
                  • Если мне не изменяет память, я тупо поместил значок панели управления в метрошный пуск. Проверить, к сожалению, смогу только в понедельник.
                    Ответить
                    • МЕТРОПРОБЛЕМЫ
                      Надо и самому попробовать Meteroism UI. Уже представляю маркетолога, составляющего превью:
                      C помощью элитного подразделения индусов-дизайнеров мы добились невероятного!
                      новый интерфейс еще на 23% неудобней! и на 13% аинтуитивней.
                      Перделки теперь на 45% больше грузят вашу систему!

                      Чую такими темпами как они делают утомленные пользователи мс начнут массово пересаживаться на консоль.
                      Ответить
                    • Да, и это работает. Но без такого размещения не всё и не всегда тривиально.
                      P.S. Ещё в восьмёрке совершеннейше препоганая виртуальная клавиатура, но это уже совсем другая история.
                      Ответить
    • А теперь детишки я вам покажу настоящее крестоблядское крестоблядство:
      http://pastebin.com/mqgFYfBR
      Ответить
      • Крестонедокрестоперекрестил:
        -for (std::vector<pthread_t>::const_iterator it = threads.begin(); it != threads.end(); it++) {
        -    pthread_join(*it, NULL);
        -}
        + std::for_each(threads.begin(), threads.end(), std::bind2nd(std::ptr_fun(pthread_join), 0));
        Ответить
      • Годная говнота. Пофапал.
        Ответить
      • А мне понравилось. Технично.
        Вот только lock1.unlock() должно вызываться и при исключениях.
        Может как-то использовать RAII и деструктор для этой цели.
        Ответить
        • Да, @bormand немного тут недокрестил. Для для таких случаев отлично подходят автообъекты. Т.е. обычно делают два класса: класс вроде Mutex с методами lock() и unlock(), и автокласс вроде Lock<T>, который берёт в конструкторе ссылку на что-то с методами lock() и unlock(), вызывает в конструкторе lock(), в деструкторе - unlock().
          В Boost.Interprocess есть примитивы для всяческих извращений.
          Ответить
          • Именно. Обявил лочку, она действует на всей области видимости и не паришся с unlockами.
            Ответить
          • буст.интерпроцесс тут незачем
            буст.тред и комплектный с ним mutex/scoped_lock, либо его копипаст в c++11

            вообще интерпроцесс неоднозначная либа, в целях покрыть вообще все возможные платформы они решили, что единственный выход - эмулировать все межпроцессные вещи через шаред мемори
            Ответить
            • Да, пожалуй, Thread наглядней. Мне просто в данный момент как раз нужны всяческие извращения из Interprocess, ибо хочется ограничить доступ нескольких не связанных прямыми родственными узами процессов к общей памяти.
              Ответить
              • насколько действительно необходимо, чтобы это были именно процессы, а не треды одного приложения?
                Ответить
                • Наверное чтоб не падало все скопом. ГуглоХром тому пример.
                  Ответить
                  • я это понимаю, просто браузер - отличный пример кучи вкладок, абсолютно независимых друг от друга, они объединяются то лишь затем, что пользователю переключаться было удобнее

                    в реальной жизни же не всегда бывают настолько изолированные части одной системы, что отказ одной части вообще никак не повлияет на работу другой и всей системы в целом
                    Ответить
                • У нас сильно извращенская хранилка на замапленной с MAP_SHARED памятью.
                  Ответить
        • Ну scoped lock на RAII очень легко делается:
          // реализация
          class scoped_locker {
          public:
              scoped_locker(locker &lock) : lock(lock) {
              }
              ~scoped_locker() {
                  lock.unlock();
              }
              operator bool() {
                  lock.lock();
                  return false;
              }
          private:
              locker &lock;
          };
          // трюк с if () {} else, позаимствованный из qt
          #define SYNCHRONIZED(lock) if (scoped_locker the_locker = lock) {} else
          // использование
          THREAD {
              for (int i=0; i<10; i++) {
                  SYNCHRONIZED(lock1) {
                      std::cout << i << std::endl;
                  }
              }
          }
          Ответить
          • Кастую в тред @defecate-plusplus.

            Не может ли получиться так, что unlock() вызовется дважды? Ведь, емнип, конструкция A a = b; сначала создает временный объект с помощью конструктора A(b), а затем вызывает конструктор копирования, после чего разрушает временную копию.
            Ответить
            • вообще scoped_lock должен быть noncopyable
              но move semantics спасут крестного отца
              Ответить
              • Если он будет noncopyable, я не смогу засунуть его в if ;( Так что остается семантика перемещения.
                Ответить
              • Как-то так:
                class scoped_locker {
                public:
                    scoped_locker(const scoped_locker &other) : lock(other.lock) {
                        other.lock = NULL;
                    }
                    scoped_locker(locker &lck) : lock(&lck) {
                        lock->lock();
                    }
                    ~scoped_locker() {
                        if (lock)
                            lock->unlock();
                    }
                    operator bool() {
                        return false;
                    }
                private:
                    mutable locker *lock;
                };
                Ответить
          • // трюк с if () {} else, позаимствованный из qt
            Помню тут еще TheCalligrapher пояснял этот хак с областями видимости и багом VC. Кстати а куда он исчез? Жаль на гк нету способа показать все посты, можно было издать книгу "Издательство Говнокод"
            Такой же трюк можно и с файлом сделать
            WITH_OPEN(file) {
                        ....
            }
            Или в бусте уже есть готовое?
            Ответить
            • if () {} else это не столько хак с областями видимости, сколько интеграция с другими ифами. Если написать просто if () то else в коде юзающем наш макрос может не туда приклеиться:
              if (x > 10)
                  SYNCHRONIZED(lock) {
                  }
              else // приклеится к if в SYNCHRONIZED и вызовет батхерты
                  doSomething();
              Ответить
            • >Кстати а куда он исчез?
              Это был сиамский близнец, после разделения ставший @defecate-plusplus & @bormand
              P.s. На тему поиска комментов:
              http://bit.ly/WwDRup
              Ответить
              • > после разделения ставший @defecate-plusplus & @bormand
                Хе-хе-хе. А Тарас (τορἄς) неделим по определению.

                >bit.ly/WwDRup
                Та я тоже так умею. Не очень удобно - сортировки нет.
                Ответить
              • он писал слишком длинные посты
                Ответить
    • За неявный int в 2013 году надо руки отрывать.
      Ответить
      • пока год помещается в int - будут писать
        Ответить
      • Где тут неявный int, someone?
        #define main1() DWORD WINAPI _main1(LPVOID lpParam)
        main1() {
            //...
        }
        Ответить
        • DWORD определён через typedef, значит, int неявный
          Ответить
          • Если я в разговоре упомяну Обаму в смысле "президента США" - это тоже неявное приведение типа "Обама" к типу "президент США"? Или просто одно из имен типа "президент США" в данной сборке "Earth. v.0.1.х b"?
            Ответить
            • Не уверен, что понял вас. Обама - экземпляр класса "президент США" :)
              Ответить
              • > Обама - экземпляр класса "президент США" :)
                Не совсем так. Обама же не родился президентом, и через несколько лет передаст полномочия другому. Поэтому Обама содержит в себе адаптер, реализующий интерфейс "Президент", ссылка на который помещена в свойство "президент" объекта "США".
                Ответить
                • Если Обама ходит как президент США и крякает как президент США, значит, он президент США
                  Ответить
                • > и через несколько лет передаст
                  Как? И он тоже?
                  Ответить
              • Неявное преобразование будет, если, скажем,
                Human obama;
                PresidentOfTheUSA presidents[44];
                presidents[43] = obama;

                Вследствие чего вызовется
                PresidentOfTheUSA(Human someone){/*...*/}

                ибо каждый президент США, в конце-концов, человек. Зато при
                Alien a_tmp;
                presidents[43] = a_tmp;

                будет бяка, поскольку такая неявность недопустима.

                Я к чему: если Человек и Чужой различны для бытия президентом США, как минимум, структурой организма, то чем для сего будут отличаться Человек и typedef Человек ЧеловекДвойноеСловоИлиВтороеИмяПрямоходя щегоПредставителяГуманоидов?
                Разница будет лишь для потомков, которым выпадет читать подобную писанину истории и догадываться, что Пабло, Непомукено и Ремедиос - это в се тот же Пикассо.
                Ответить
            • Зеленый текст означает - "читайте с особой внимательностью, воспринимайте это с повышенной серьёзностью, здесь нет места юмору"
              Ответить

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