Кресты / Говнокод #12694 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 LispGovno, (Updated )

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

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

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

        против кода - использование платформозависимых сущностей, plain C style в разделе C++. Не говоря уже про кривой код
        Ответить
        • > неюзабельными свистопердящими интерфейсами
          подробнее
          Ответить
            • А мне, хоть я и недолюбливаю винду, как не странно понравился 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 сработали ls, pwd, man и можно выставить ширину консоли в 200 колонок.
                          Ответить
                  • M-! explorer
                    - Открыть файл программой зарегистрированой для расширения этого файла.

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

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

                    Чую такими темпами как они делают утомленные пользователи мс начнут массово пересаживаться на консоль.
                    Ответить
                  • Да, и это работает. Но без такого размещения не всё и не всегда тривиально.
                    P.S. Ещё в восьмёрке совершеннейше препоганая виртуальная клавиатура, но это уже совсем другая история.
                    Ответить
    • Крестонедокрестоперекрестил:
      -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, ибо хочется ограничить доступ нескольких не связанных прямыми родственными узами процессов к общей памяти.
            Ответить
            • насколько действительно необходимо, чтобы это были именно процессы, а не треды одного приложения?
              Ответить
              • Наверное чтоб не падало все скопом. ГуглоХром тому пример.
                Ответить
                • я это понимаю, просто браузер - отличный пример кучи вкладок, абсолютно независимых друг от друга, они объединяются то лишь затем, что пользователю переключаться было удобнее

                  в реальной жизни же не всегда бывают настолько изолированные части одной системы, что отказ одной части вообще никак не повлияет на работу другой и всей системы в целом
                  Ответить
      • Ну 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), а затем вызывает конструктор копирования, после чего разрушает временную копию.
          Ответить
            • Если он будет 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, someone?
      #define main1() DWORD WINAPI _main1(LPVOID lpParam)
      main1() {
          //...
      }
      Ответить
        • Если я в разговоре упомяну Обаму в смысле "президента США" - это тоже неявное приведение типа "Обама" к типу "президент США"? Или просто одно из имен типа "президент США" в данной сборке "Earth. v.0.1.х b"?
          Ответить
            • > Обама - экземпляр класса "президент США" 🙂
              Не совсем так. Обама же не родился президентом, и через несколько лет передаст полномочия другому. Поэтому Обама содержит в себе адаптер, реализующий интерфейс "Президент", ссылка на который помещена в свойство "президент" объекта "США".
              Ответить
            • Неявное преобразование будет, если, скажем,
              Human obama;
              PresidentOfTheUSA presidents[44];
              presidents[43] = obama;

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

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

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

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

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

Семь раз отмерь — один отрежь, guest!

    А не использовать ли нам bbcode?


    8